简体   繁体   中英

Android using RecyclerView in fragments with remote data fetch

I am building my first android application where I will have bottom navigation with three buttons which are attached to fragments. First fragment ( MessageFragment ) is for responsible for listing all messages from the server using Volley and Gson libs.

I am trying to load messages from the server which return JSON data in the form.

[
 {
  "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"
 },
 ....
]  

I have found a good example of RecyclerView in fragment but unfortunately, in this example data is not coming from the remote.

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

Can someone help me to why I am not getting data in the adapter when I using below code?

What should I do to fix it?

Here is my code

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();
}
}

Set your Recycler Adapter on post loaded.

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
    }
};

Also may be you need to parse JSON data from onResponse whatever you need to display parse from response string and display it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM