如何使用 volley 将数据(json)加载到回收站视图中 [英] How to load data(json) into recycler view using volley
问题描述
我已经在我的应用程序中实现了 recyclerview,现在我需要从服务器获取数据,我才知道 volley 是获取数据的最佳方式.我在网上搜索过,但找不到合适的教程.
这就是我在我的代码中初始化 recyclerview 的方式.(它有硬编码的数据集)
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(linearLayoutManager);mAdapter = new CardAdapter();mRecyclerView.setAdapter(mAdapter);
这是适配器代码.
public class CardAdapter extends RecyclerView.Adapter{ArrayListmItems;公共 int TAG=0;公共卡适配器(){极好的();mItems = new ArrayList<>();BusRouteNameDetails routename = new BusRouteNameDetails();routename.setName("xyz");routename.setNumber("X4");mItems.add(routename);routename = new BusRouteNameDetails();routename.setName("xyz");routename.setNumber("X4");mItems.add(routename);routename = new BusRouteNameDetails();routename.setName("xyz");routename.setNumber("X4");mItems.add(routename);routename = new BusRouteNameDetails();routename.setName("xyz");routename.setNumber("X4");mItems.add(routename);routename = new BusRouteNameDetails();routename.setName("xyz");routename.setNumber("X4");mItems.add(routename);}@覆盖公共 ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {视图 v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.busroutename_list, viewGroup, false);ViewHolder viewHolder = new ViewHolder(v);返回 viewHolder;}@覆盖公共无效 onBindViewHolder(ViewHolder viewHolder, int i) {BusRouteNameDetails routename = mItems.get(i);viewHolder.tvName.setText(routename.getName());viewHolder.tvRoutename.setText(routename.getNumber());Log.e("TAG","i value="+ i);if(i==mItems.size()-1)viewHolder.seperator.setVisibility(View.INVISIBLE);}@覆盖公共 int getItemCount() {Log.e("TAG","物品尺寸"+ mItems.size());返回 mItems.size();}类 ViewHolder 扩展 RecyclerView.ViewHolder{公共 TextView tvName;公共 TextView tvRoutename;公共视图分隔符;公共 ViewHolder(查看 itemView){超级(项目视图);tvName = (TextView)itemView.findViewById(R.id.RouteName1);tvRoutename = (TextView)itemView.findViewById(R.id.Route_src_dest);seperator=(View)itemView.findViewById(R.id.seperator);}}}
这里是 getter 和 setter
public class BusRouteNameDetails {私人字符串 mName;私人字符串 mNumber;公共字符串 getName() {返回名称;}公共无效集名称(字符串名称){this.mName = 名称;}公共字符串 getNumber() {返回 mNumber;}public void setNumber(String Number) {this.mNumber = 数字;}}
你可以试试我的以下解决方案:
让我们假设服务器响应为以下 JSON:
<预><代码>[{"name": "人 1",年龄":30},{"name": "人 2",年龄":20},{"name": "人 3",年龄":40}]在您的 Android 项目中:
public class Person {字符串名称;整数年龄;人() {}}公共类 RVAdapter 扩展 RecyclerView.Adapter{列表<人>人;RVAdapter(列表<人>人){this.persons = 人;}@覆盖public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);PersonViewHolder pvh = 新的 PersonViewHolder(v);返回 pvh;}@覆盖公共无效 onBindViewHolder(PersonViewHolder 持有人,int 位置){holder.personName.setText(persons.get(position).name);holder.personAge.setText(String.valueOf(persons.get(position).age));}@覆盖公共 int getItemCount() {如果(人!= null){返回persons.size();}返回0;}@覆盖公共无效 onAttachedToRecyclerView(RecyclerView recyclerView) {super.onAttachedToRecyclerView(recyclerView);}公共静态类 PersonViewHolder 扩展 RecyclerView.ViewHolder {CardView 简历;TextView 人名;TextView personAge;PersonViewHolder(查看 itemView){超级(项目视图);cv = (CardView) itemView.findViewById(R.id.cv);personName = (TextView) itemView.findViewById(R.id.person_name);personAge = (TextView) itemView.findViewById(R.id.person_age);}}}
然后在您的活动中:
<代码> ...RecyclerView rv = (RecyclerView)findViewById(R.id.rv);rv.setHasFixedSize(true);LinearLayoutManager llm = 新的 LinearLayoutManager(mContext);rv.setLayoutManager(llm);最终 RVAdapter rvAdapter = 新 RVAdapter(personList);rv.setAdapter(rvAdapter);RequestQueue requestQueue = Volley.newRequestQueue(mContext);String url = "http://192.16.1.100/api/persons";JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener() {@覆盖公共无效onResponse(JSONArray响应){尝试 {如果(响应.长度()> 0){personList.clear();for (int i = 0; i < response.length(); i++) {JSONObject jsonObject = response.getJSONObject(i);人人 = 新人();if (!jsonObject.isNull("name")) {person.name = jsonObject.getString("name");}如果(!jsonObject.isNull(年龄")){person.age = jsonObject.getInt("age");}personList.add(i, person);}rvAdapter.notifyDataSetChanged();}} catch (JSONException e) {e.printStackTrace();}}}, 新的 Response.ErrorListener() {@覆盖公共无效onErrorResponse(VolleyError错误){//做一点事}});requestQueue.add(jsonArrayRequest);...
结果如下
希望这有帮助!
I have implemented recyclerview in my application and now i need to fetch data from the server and i just came to know about volley being the best way to fetch data. I searched online but i am unable to find a proper tutorial for the same.
This is how i initialized the recyclerview in my code.(which has hardcoded data set)
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);
mAdapter = new CardAdapter();
mRecyclerView.setAdapter(mAdapter);
here is the adapter code.
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
ArrayList<BusRouteNameDetails> mItems;
public int TAG=0;
public CardAdapter() {
super();
mItems = new ArrayList<>();
BusRouteNameDetails routename = new BusRouteNameDetails();
routename.setName("xyz");
routename.setNumber("X4");
mItems.add(routename);
routename = new BusRouteNameDetails();
routename.setName("xyz");
routename.setNumber("X4");
mItems.add(routename);
routename = new BusRouteNameDetails();
routename.setName("xyz");
routename.setNumber("X4");
mItems.add(routename);
routename = new BusRouteNameDetails();
routename.setName("xyz");
routename.setNumber("X4");
mItems.add(routename);
routename = new BusRouteNameDetails();
routename.setName("xyz");
routename.setNumber("X4");
mItems.add(routename);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.busroutename_list, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
BusRouteNameDetails routename = mItems.get(i);
viewHolder.tvName.setText(routename.getName());
viewHolder.tvRoutename.setText(routename.getNumber());
Log.e("TAG","i value="+ i);
if(i==mItems.size()-1)
viewHolder.seperator.setVisibility(View.INVISIBLE);
}
@Override
public int getItemCount() {
Log.e("TAG","item size"+ mItems.size());
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView tvName;
public TextView tvRoutename;
public View seperator;
public ViewHolder(View itemView) {
super(itemView);
tvName = (TextView)itemView.findViewById(R.id.RouteName1);
tvRoutename = (TextView)itemView.findViewById(R.id.Route_src_dest);
seperator=(View)itemView.findViewById(R.id.seperator);
}
}
}
And here are the getters and setters
public class BusRouteNameDetails {
private String mName;
private String mNumber;
public String getName() {
return mName;
}
public void setName(String name) {
this.mName = name;
}
public String getNumber() {
return mNumber;
}
public void setNumber(String Number) {
this.mNumber = Number;
}
}
You can try as my following solution:
Let's assume the server response as the following JSON:
[
{
"name": "Person 1",
"age": 30
},
{
"name": "Person 2",
"age": 20
},
{
"name": "Person 3",
"age": 40
}
]
In your Android project:
public class Person {
String name;
Integer age;
Person() {
}
}
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
List<Person> persons;
RVAdapter(List<Person> persons) {
this.persons = persons;
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {
holder.personName.setText(persons.get(position).name);
holder.personAge.setText(String.valueOf(persons.get(position).age));
}
@Override
public int getItemCount() {
if (persons != null) {
return persons.size();
}
return 0;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView personName;
TextView personAge;
PersonViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
personName = (TextView) itemView.findViewById(R.id.person_name);
personAge = (TextView) itemView.findViewById(R.id.person_age);
}
}
}
Then in your Activity:
...
RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
rv.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(mContext);
rv.setLayoutManager(llm);
final RVAdapter rvAdapter = new RVAdapter(personList);
rv.setAdapter(rvAdapter);
RequestQueue requestQueue = Volley.newRequestQueue(mContext);
String url = "http://192.16.1.100/api/persons";
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
if (response.length() > 0) {
personList.clear();
for (int i = 0; i < response.length(); i++) {
JSONObject jsonObject = response.getJSONObject(i);
Person person = new Person();
if (!jsonObject.isNull("name")) {
person.name = jsonObject.getString("name");
}
if (!jsonObject.isNull("age")) {
person.age = jsonObject.getInt("age");
}
personList.add(i, person);
}
rvAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// do something
}
});
requestQueue.add(jsonArrayRequest);
...
Here is the result
Hope this helps!
这篇关于如何使用 volley 将数据(json)加载到回收站视图中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!