我有很多物品的Recycler View。我要做的是更改被单击的物品内TextView中的文本。我以这种方式做到了:
wordList.set(position, newWord);
MyProgressActivityAdapter newAdapter = new MyProgressActivityAdapter(wordList, this);
newAdapter.notifyItemChanged(position);
recyclerView.setAdapter(newAdapter);
并且一切正常,除了每次单击项目时屏幕都转到顶部。我该怎么做才能避免这种情况?
您应该使用有效载荷版本的notifyItemChanged
,这是一个简单的示例,供您使用:[]
adapter.notifyItemChanged(position, "updateText");
然后在您的
RecyclerAdapter
中覆盖onBindViewHolder
的有效负载版本:
然后绑定数据,因此您只需调用@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) { if (payloads.isEmpty()) onBindViewHolder(holder, position); else if ("updateText".equals(payloads.get(0))) { if (holder instanceof YourViewHolder) { ((YourViewHolder) holder).textView.setText(dataProvider.get(position).getNewText()); } } }
请注意,此方法可防止
RecyclerView
创建新的ViewHolder
notifyItemChanged
而不重置适配器,等等。notifyItemChanged(position)
应该可以正确处理。尝试在onBindViewHolder
内部处理此问题,如下所示: