簡體   English   中英

Android在片段中使用RecyclerView進行遠程數據獲取

[英]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示例,但是不幸的是,在此示例中,數據不是來自遠程的。

https://developer.android.com/samples/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.html

有人可以幫我為什么當我使用下面的代碼時為什么沒有在適配器中獲取數據嗎?

我該怎么解決?

這是我的代碼

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM