简体   繁体   English

RecyclerView聊天从顶部加载更多项目

[英]RecyclerView chat load more items from top

I am trying to implement pagination in recyclerview to load more chat messages when the user scrolls to top , this is achieved by sending the last message time ie coversations[0] time to the API , but when the new list is added the old List gets repeated many times . 我正在尝试在recyclerview中实现分页,以在用户滚动到顶部时加载更多聊天消息,这是通过向API发送最后一条消息时间(即Coverations [0]时间)来实现的,但是当添加新列表时,旧列表会得到重复了很多次。 I think this is because i am not updating the time properly , What is the correct way to achieve this? 我认为这是因为我没有适当地更新时间,实现此目的的正确方法是什么?

This is the code i am using, first time i am setting the flag to false and time as empty. 这是我正在使用的代码,第一次将标志设置为false且时间为空。

getConvoData(k, " ", "", false);
private String last_msg_time = " ";
private Boolean flag = false;

rv_convo.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (!recyclerView.canScrollVertically(-1)) {
            if (conversations != null) {
                String time = last_msg_time;
                getConvoData(k, " ", time, true);
            }
        }
    }
});

this is the method for fetching conversation Data 这是获取对话数据的方法

private void getConvoData(final String k, final String new_message, final String last_time, final boolean flag) {
final String token1 = Global.shared().tb_token;
final String url = "https://app.aer.media/v2/message_router/_getChat";
final JSONObject jsonBody = new JSONObject();
final ProgressDialog progressDialog = new ProgressDialog(this);
final String mRequestBody = jsonBody.toString();
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new com.android.volley.Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        try {
            JSONObject jObj = new JSONObject(response);
            final JSONObject data = jObj.getJSONObject("data");
            conversations = data.getJSONArray("conversation");
            JSONObject for_chat = data.getJSONObject("for_chat");
            JSONArray jsonArr_chat = new JSONArray();
            jsonArr_chat.put(for_chat);
            params = (RelativeLayout.LayoutParams) rv_convo.getLayoutParams();
            GsonBuilder gsonBuilder = new GsonBuilder();
            Gson gson = gsonBuilder.create();

            if (!flag) {
                convobeans = gson.fromJson(conversations.toString(), convType);
                last_msg_time = conversations.getJSONObject(0).getString("time");
                Log.d("OldList", convobeans.toString());
                adapter = new ChatDetailsAdapter(forChatBeen, convobeans, ChatDetailsActivity.this, forChatBeansList, image, name, initials, new_message, bitmap);
    //          Collections.reverse(convobeans);
                rv_convo.setAdapter(adapter);
                rv_convo.smoothScrollToPosition( rv_convo.getAdapter().getItemCount() - 1);
                adapter.notifyDataSetChanged();
                rv_convo.setNestedScrollingEnabled(true);
            } else {
                newConvo = gson.fromJson(conversations.toString(), convType);
                last_msg_time = conversations.getJSONObject(0).getString("time");
                if (newConvo != null && newConvo.size() > 0) {
                    Log.d("newList", newConvo.toString());
                    convobeans.addAll(0, newConvo);
                    adapter.notifyItemChanged(0, newConvo.size());
                }
            }
        }
    }
}

Depending on the flag I am updating the list and updating the time as well but the list gets repeated in the RecyclerView due to the previous time being passed , how do I update the time optimally and fetch the new list each time? 根据标志,我将更新列表并同时更新时间,但是由于之前的时间过去,该列表在RecyclerView重复出现,如何最佳地更新时间并每次获取新列表?

This code is used to fetch the data when the user scroll down in a recylerview . 当用户在recylerview scroll down时,此代码用于获取数据。 Just analyze this code you will get the basic idea. 只需分析这段代码,您就会了解基本思想。

rvCategory.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if (dy > 0) {
                    visibleItemCount = mLinearLayoutManager.getChildCount();
                    totalItemCount = mLinearLayoutManager.getItemCount();
                    pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();

                    if (loading) {
                        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                            loading = false;
                            fetchData();
                        }
                    }
                }
            }
        });

Function FetchData() 函数FetchData()

private void fetchData() {
        String url = EndPoints.location + "getMobileData.php?lastData=" + lastData;
        JsonObjectRequest jsObjRequest = new JsonObjectRequest
                (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            lastData = response.getString("last");
                            JSONArray jArray = response.getJSONArray("response");
                            if (jArray.length() == 0) {
                                //Empty condition
                            } else {
                                for (int i = 0; i < jArray.length(); i++) {
                                   //Append the chat with the Dataobject of your modelAnd swap the recylerview view with new data
                                  //Example
                                }
                                adapter.swap(rvHomeModel.createHomeList(DataPathsHome, true));
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        loading = true;
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO Auto-generated method stub
                        loading = true;
                        Toast.makeText(CategoryView.this, "No internet connection", Toast.LENGTH_LONG).show();
                    }
                });


        // Add a request (in this example, called stringRequest) to your RequestQueue.
        MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
    }

Create a function called swap in your adapter class that accept the new dataset 在您的适配器类中创建一个名为swap的函数,该函数接受新数据集

public void swap(List<rvHomeModel> list) {
    //Check your previouse dataset used in adapter is empty or not
    if (rvHomeModels!= null) {
        rvHomeModels.clear();
        rvHomeModels.addAll(list);
    } else {
        rvHomeModels = list;
    }
    notifyDataSetChanged();
}

At server 在服务器上
1. Get the previous value 1.获取先前的值
2. Do the database operation and get the chats id < of previous 2.执行数据库操作并获取上一个的聊天ID <
2. Create a JSON Object contain 2.创建一个JSON对象包含

{
 last:last_chat_id,
 response:{
    //Your chat 
    }
}  

This is not a perfect solution for this question. 对于这个问题,这不是一个完美的解决方案。 But you will get the basic idea about what you are looking for. 但是您将获得有关所需内容的基本想法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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