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

时间:2017-10-24 08:07:32

标签: android

我正在尝试在recyclerview中实现分页以在用户滚动到顶部时加载更多聊天消息,这是通过向API发送最后消息时间即覆盖[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中重复,如何以最佳方式更新时间并获取新列表每一次?

1 个答案:

答案 0 :(得分:-1)

  

此代码用于在scroll down中的用户recylerview时获取数据。只需分析这段代码,您就会得到基本的想法。

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&lt;之前的 2.创建包含

的JSON对象
{
 last:last_chat_id,
 response:{
    //Your chat 
    }
}  
  

对于这个问题,这不是一个完美的解决方案。但是你会得到关于你在寻找什么的基本想法。