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
中,并将其传递给方法
现在,当您需要在列表中添加新消息时,请调用此方法。检查