【问题标题】:How to change single item in recycler view without screen reload?如何在不重新加载屏幕的情况下更改回收站视图中的单个项目?
【发布时间】:2019-11-08 16:25:30
【问题描述】:

我有 Recycler View,里面有很多项目。我想要做的是更改 TextView 中被点击的项目内的文本。我是这样做的:

        wordList.set(position, newWord);
        MyProgressActivityAdapter newAdapter = new MyProgressActivityAdapter(wordList, this);
        newAdapter.notifyItemChanged(position);
        recyclerView.setAdapter(newAdapter);

除了每次单击项目时屏幕都会转到顶部之外,一切正常。我该怎么做才能避免这种情况?

【问题讨论】:

  • 这段代码在onItemClickListener里面吗?从代码来看,您似乎正在初始化一个新适配器……您可能不希望每次更改一个项目时都初始化一个全新的适配器。旧适配器上的notifyItemChanged(position) 应该是您需要做的所有事情。
  • 你说得对,我改变了我的代码,但即使现在每次我点击单个项目时屏幕都会跳到顶部。
  • 您可以尝试在 UI 线程上运行,如此答案所示:stackoverflow.com/a/17696214/1421014

标签: java android


【解决方案1】:

你应该使用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 而无需重置适配器等等。

【讨论】:

    【解决方案2】:

    notifyItemChanged(position) 如果您正确处理它应该可以工作。尝试在onBindViewHolder 中处理这个问题,如下所示:

    override fun onBindViewHolder(holder: RecyclerHolder, position: Int) {
        holder.itemView.text_view.text = items[position]
    
        holder.itemView.button.setOnClickListener {
            items[position] = "New Text"
            notifyItemChanged(position)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多