簡體   English   中英

RecyclerView聊天從頂部加載更多項目

[英]RecyclerView chat load more items from top

我正在嘗試在recyclerview中實現分頁,以在用戶滾動到頂部時加載更多聊天消息,這是通過向API發送最后一條消息時間(即Coverations [0]時間)來實現的,但是當添加新列表時,舊列表會得到重復了很多次。 我認為這是因為我沒有適當地更新時間,實現此目的的正確方法是什么?

這是我正在使用的代碼,第一次將標志設置為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);
            }
        }
    }
});

這是獲取對話數據的方法

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

根據標志,我將更新列表並同時更新時間,但是由於之前的時間過去,該列表在RecyclerView重復出現,如何最佳地更新時間並每次獲取新列表?

當用戶在recylerview scroll down時,此代碼用於獲取數據。 只需分析這段代碼,您就會了解基本思想。

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

函數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);
    }

在您的適配器類中創建一個名為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();
}

在服務器上
1.獲取先前的值
2.執行數據庫操作並獲取上一個的聊天ID <
2.創建一個JSON對象包含

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

對於這個問題,這不是一個完美的解決方案。 但是您將獲得有關所需內容的基本想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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