繁体   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