[英]Android using RecyclerView in fragments with remote data fetch
我正在構建我的第一個android應用程序,在該應用程序中我將通過三個附加到片段的按鈕進行底部導航。 第一個片段( MessageFragment )負責使用Volley和Gson庫列出來自服務器的所有消息。
我正在嘗試從服務器加載以表單形式返回JSON數據的消息。
[
{
"id": "1",
"message": "Some message",
"created_at": "2017-08-23 12:38:31"
},
{
"id": "2",
"message": "Another message",
"created_at": "2017-08-23 12:39:28"
},
....
]
我在片段中找到了一個很好的RecyclerView示例,但是不幸的是,在此示例中,數據不是來自遠程的。
有人可以幫我為什么當我使用下面的代碼時為什么沒有在適配器中獲取數據嗎?
我該怎么解決?
這是我的代碼
MessageFragment.java
public class MessageFragment extends Fragment {
private Context mContext;
private static final String ENDPOINT = "http://10.0.2.2/message/list?userid=1";
List<Message> msgs = new ArrayList<Message>();
private RequestQueue requestQueue;
private Gson gson;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mContext=context;
}
public static MessageFragment newInstance() {
MessageFragment fragment = new MessageFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestQueue = Volley.newRequestQueue(this.mContext);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("M/d/yy hh:mm a");
gson = gsonBuilder.create();
fetchMessages();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false);
RecyclerView recyclerView = view.findViewById(R.id.rvMessages);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); //set layoutManger
MessageRVAdapter mAdapter = new MessageRVAdapter(msgs);//create an adapter
recyclerView.setAdapter(mAdapter); // set adapter
return view;
}
private void fetchMessages() {
System.out.println("Now in fetchMessages");
StringRequest request = new StringRequest(Request.Method.GET, ENDPOINT, onPostsLoaded, onPostsError);
requestQueue.add(request);
}
private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
msgs = Arrays.asList(gson.fromJson(response, Message[].class));
System.out.println("inside " + msgs);
}
};
private final Response.ErrorListener onPostsError = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Messages load fail");
Log.e("PostActivity", error.toString());
}
};
}
MessageRVAdapter.php
public class MessageRVAdapter extends RecyclerView.Adapter<MessageRVAdapter.MyViewHolder> {
private List<Message> messages;
public MessageRVAdapter(List<Message> messages) {
this.messages = messages;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView message;
public MyViewHolder(View view) {
super(view);
message = (TextView) view.findViewById(R.id.rvMessage);
}
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Message message = messages.get(position);
holder.message.setText(message.getMessages());
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.rvmessages_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public int getItemCount() {
return messages.size();
}
}
在加載后設置您的回收適配器 。
private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
msgs = Arrays.asList(gson.fromJson(response, Message[].class));
System.out.println("inside " + msgs);
MessageRVAdapter mAdapter = new MessageRVAdapter(msgs);//create an adapter
recyclerView.setAdapter(mAdapter); // set adapter
}
};
也可能是您需要從onResponse解析JSON數據 ,無論您需要顯示從響應字符串進行解析並顯示它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.