Android 使recyclerview不跳到顶部

Android 使recyclerview不跳到顶部,android,android-recyclerview,Android,Android Recyclerview,我每分钟都在执行getMessages(),由于 myadapter.notifyDataSetChanged() 我如何使Recyclerview保持其位置,即使它是否已更新 private void getMessages() { StringRequest request = new StringRequest(Request.Method.POST, uRl, response -> { try{ if

我每分钟都在执行
getMessages()
,由于

myadapter.notifyDataSetChanged()

我如何使Recyclerview保持其位置,即使它是否已更新

    private void getMessages() {
        StringRequest request = new StringRequest(Request.Method.POST, uRl, response -> {
            try{
                if (lstMessages != null) {
                    lstMessages.clear();
                }
                    JSONArray jsonArray = new JSONArray(response);
                    for (int i = 0; i < jsonArray.length(); i++) {
                        try {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            chatModel um = new chatModel();
                            um.setM_msg(jsonObject.getString("message"));
                            lstMessages.add(um);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
            }catch (JSONException e2){
                e2.printStackTrace();
            }

            if (!started) {
                layoutManager = new LinearLayoutManager(this);
                layoutManager.setStackFromEnd(true);
                rv_msg.setLayoutManager(layoutManager);
                chat myadapter = new chat(this, lstMessages);
                rv_msg.setAdapter(myadapter);
                start();
            } else {
               chat myadapter = new chat(this, lstMessages);
                myadapter.notifyDataSetChanged();
            }
        }, error -> {
            MySingleton.getmInstance(this).MySingletonClear(this);
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();
                param.put("aa", String.valueOf(aa));
                param.put("bb", String.valueOf(bb));

                return param;
            }
        };
        request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        MySingleton.getmInstance(this).addToRequestQueue(request);
    }
private void getMessages(){
StringRequest=新的StringRequest(request.Method.POST,uRl,response->{
试一试{
if(lstMessages!=null){
lstMessages.clear();
}
JSONArray JSONArray=新JSONArray(响应);
for(int i=0;i{
MySingleton.getMinInstance(this).MySingletonClear(this);
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
HashMap param=新的HashMap();
参数put(“aa”,String.valueOf(aa));
参数put(“bb”,String.valueOf(bb));
返回参数;
}
};
request.setRetryPolicy(新的DefaultRetryPolicy(30000,DefaultRetryPolicy.DEFAULT\u MAX\u RETRIES,DefaultRetryPolicy.DEFAULT\u BACKOFF\u MULT));
GetMinInstance(this).addToRequestQueue(请求);
}
尝试添加此代码

View v = rv_msg.getChildAt(0);
int top = (v == null) ?0 : v.getTop();
layoutManager.scrollToPositionWithOffset(lstMessages.size(), top);

myadapter.notifyDataSetChanged()之后

如果清除数据列表并使用
notifyDataSetChanges()
recyclerview将刷新所有项目

您可以使用distinct函数来防止重复数据。 下面是一个不同函数的示例:

private void distinctMessages(List<Message> newMessages) {
    if (lstMessages.size() < 1 || lstMessages == null) {
        lstMessages.addAll(newMessages);

        return;
    }

    for (Message newMessage: newMessages) {
        boolean hasSameMessages = false;
        
        for (Message currentMessage: lstMessages) {
            if (newMessage.getId().equals(currentMessage.getId())) {
                hasSameMessages = true;
                break;
            }
        }

        if (!hasSameMessages) {
            lstMessages.add(newMessage);
        }
    }
}
private void distinctMessages(列出新邮件){
if(lstMessages.size()<1 | | lstMessages==null){
lstMessages.addAll(newMessages);
返回;
}
对于(消息newMessage:newMessages){
布尔hasSameMessages=false;
对于(消息currentMessage:lstMessages){
if(newMessage.getId().equals(currentMessage.getId())){
hasSameMessages=true;
打破
}
}
如果(!hasSameMessages){
lstMessages.add(newMessage);
}
}
}
您可以在现有代码中使用它,如下所示:

private void getMessages() {
    StringRequest request = new StringRequest(Request.Method.POST, uRl, response -> {
        try{
            ArrayList<Message> newMessages = new ArrayList<Message>;
            JSONArray jsonArray = new JSONArray(response);

            for (int i = 0; i < jsonArray.length(); i++) {
                try {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    chatModel um = new chatModel();
                    um.setM_msg(jsonObject.getString("message"));
                    newMessages.add(um);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            distinctMessages(newMessages);
        }catch (JSONException e2){
            e2.printStackTrace();
        }

        if (!started) {
            layoutManager = new LinearLayoutManager(this);
            layoutManager.setStackFromEnd(true);
            rv_msg.setLayoutManager(layoutManager);
            chat myadapter = new chat(this, lstMessages);
            rv_msg.setAdapter(myadapter);
            start();
        } else {
            chat myadapter = new chat(this, lstMessages);
            myadapter.notifyDataSetChanged();
        }
    }, error -> {
        MySingleton.getmInstance(this).MySingletonClear(this);
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            HashMap<String, String> param = new HashMap<>();
            param.put("aa", String.valueOf(aa));
            param.put("bb", String.valueOf(bb));

            return param;
        }
    };
    request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    MySingleton.getmInstance(this).addToRequestQueue(request);
}
private void getMessages(){
StringRequest=新的StringRequest(request.Method.POST,uRl,response->{
试一试{
ArrayList newMessages=新ArrayList;
JSONArray JSONArray=新JSONArray(响应);
for(int i=0;i{
MySingleton.getMinInstance(this).MySingletonClear(this);
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
HashMap param=新的HashMap();
参数put(“aa”,String.valueOf(aa));
参数put(“bb”,String.valueOf(bb));
返回参数;
}
};
request.setRetryPolicy(新的DefaultRetryPolicy(30000,DefaultRetryPolicy.DEFAULT\u MAX\u RETRIES,DefaultRetryPolicy.DEFAULT\u BACKOFF\u MULT));
GetMinInstance(this).addToRequestQueue(请求);
}

请看一看

您是否尝试过
notifyItemRangeChanged(int positionStart,int itemCount)
?在附加新项目时,必须使用此选项,而不是
notifyDataSetChanged()

在适配器中添加一个方法,如下所示:

 public void appendListToAdapter(List<String> list) {
    int currentListSize = this.mList.size();
    this.mList.addAll(list);
    notifyItemRangeChanged(currentListSize, list.size());
}
public void appendListToAdapter(列表){
int currentListSize=this.mList.size();
this.mList.addAll(列表);
notifyItemRangeChanged(currentListSize,list.size());
}
只需将旧的列表大小抓取到
currentListSize
中,并将其传递给方法

现在,当您需要在列表中添加新消息时,请调用此方法。

检查