Gson TypeToken?

时间:2018-05-16 18:32:25

标签: android gson

我是android studio的初学者。我拿了这段代码androidhive  并且我使用我的Json文件的模式更改了我的mainactivity中的GET请求,但每次运行时只显示姓氏。  任何解决方案?

my GET request

 AuthJsonArrayRequest request = new AuthJsonArrayRequest(Request.Method.GET,URL,null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    if (response == null) {
                        Toast.makeText(getApplicationContext(), "Couldn't fetch the contacts! Pleas try again.", Toast.LENGTH_LONG).show();
                        return;
                    }

                    try {
                        List<Contact> items =new ArrayList<Contact>();


                        for (int i = 0; i < response.length(); i++) {
                            JSONObject employee = response.getJSONObject(i);
                            Contact e=new Contact();

                            e.firstname = employee.getString("firstname");
                            e.lastname = employee.getString("lastname");
                            e.phone = employee.getString("phone");
                            items.add(e);
                        }
                        contactList.clear();
                        contactList.addAll(items);

                        // refreshing recycler view
                        mAdapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    // adding contacts to contacts list

                }

my Json

[
  {
"firstname": "Tom ",
"lastname": "Hardy",
"phone": "(541) 754-3010"
  },

  {
"firstname": "Johnny",
"lastname": "Depp",
"phone": "(452) 839-1210"
  },


{
"firstname": "nahla",
"lastname": "De",
"phone": "(452) 039-1210"
  },
  {
"firstname": "maher",
"lastname": "er",
"phone": "(452) 139-1210"
  },

  {
"firstname": "rautha",
"lastname": "ben",
"phone": "(452) 239-1210"
  }
]

result

这是androidhive Json

[{
    "name": "Tom Hardy",
    "image": "https://api.androidhive.info/json/images/tom_hardy.jpg",
    "phone": "(541) 754-3010"
},
{
    "name": "Johnny Depp",
    "image": "https://api.androidhive.info/json/images/johnny.jpg",
    "phone": "(452) 839-1210"
}
]

androidhive GET request。 // androidhive GET请求

JsonArrayRequest request = new JsonArrayRequest(URL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    if (response == null) {
                        Toast.makeText(getApplicationContext(), "Couldn't fetch the contacts! Pleas try again.", Toast.LENGTH_LONG).show();
                        return;
                    }

                    List<Contact> items = new Gson().fromJson(response.toString(), new TypeToken<List<Contact>>() {
                    }.getType());

                    // adding contacts to contacts list
                    contactList.clear();
                    contactList.addAll(items);

                    // refreshing recycler view
                    mAdapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // error in getting json
            Log.e(TAG, "Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(), "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    MyApplication.getInstance().addToRequestQueue(request);
}

此ContactsAdapter类

public class ContactsAdapter extends 
RecyclerView.Adapter<ContactsAdapter.MyViewHolder>
    implements Filterable {
private Context context;
private List<Contact> contactList;
private List<Contact> contactListFiltered;
private ContactsAdapterListener listener;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView name, phone;
    public ImageView thumbnail;

    public MyViewHolder(View view) {
        super(view);
        name = view.findViewById(R.id.name);
        phone = view.findViewById(R.id.phone);
        thumbnail = view.findViewById(R.id.thumbnail);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // send selected contact in callback
                listener.onContactSelected(contactListFiltered.get(getAdapterPosition()));
            }
        });
    }
}


public ContactsAdapter(Context context, List<Contact> contactList, ContactsAdapterListener listener) {
    this.context = context;
    this.listener = listener;
    this.contactList = contactList;
    this.contactListFiltered = contactList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.user_row_item, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    final Contact contact = contactListFiltered.get(position);
    holder.name.setText(contact.getFirstname()+" "+contact.getLastname());
    holder.phone.setText(contact.getPhone());

    /*Glide.with(context)
            .load(contact.getImage())
            .apply(RequestOptions.circleCropTransform())
            .into(holder.thumbnail);*/
}

@Override
public int getItemCount() {
    return contactListFiltered.size();
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                contactListFiltered = contactList;
            } else {
                List<Contact> filteredList = new ArrayList<>();
                for (Contact row : contactList) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getFirstname().toLowerCase().contains(charString.toLowerCase()) || row.getPhone().contains(charSequence)) {
                        filteredList.add(row);
                    }
                }

                contactListFiltered = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = contactListFiltered;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            contactListFiltered = (ArrayList<Contact>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

public interface ContactsAdapterListener {
    void onContactSelected(Contact contact);
}

}

0 个答案:

没有答案