【问题标题】:Android RecyclerView content not updating after notifyItemInserted在 notifyItemInserted 后 Android RecyclerView 内容未更新
【发布时间】:2021-09-03 02:22:44
【问题描述】:

我有一个 RecyclerView,需要在收到内容时实时更新。它在第一次加载时成功显示了所有内容。尝试动态添加新项目时,没有区别。我在这里做错了什么吗?非常感谢!

MainActivity:

RecyclerView rvClips;
ClipboardRVAdapter adapter;
ArrayList<Clip> clips = new ArrayList<>();

private void SetupRV() {
    adapter = new ClipboardRVAdapter(clips);
    rvClips.setAdapter(adapter);
    adapter.setClickListener(this);
    rvClips.setLayoutManager(new LinearLayoutManager(getActivity()));
}

//this method gets called everytime a new item is received. I confirmed that it gets called.
public void OnNewClipReceived(Clip clip) {
    clips.add(0, clip);
    adapter.notifyItemInserted(0);
}

适配器:

标准适配器代码。简单地显示recyclerview中的所有项目。

public class ClipboardRVAdapter extends RecyclerView.Adapter<ClipboardRVAdapter.ViewHolder> {

    private ItemClickListener mClickListener;
    ArrayList<Clip> clips;

    public ClipboardRVAdapter(ArrayList<Clip> clips) {
        this.clips = clips;
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        // Inflate the custom layout
        View contactView = inflater.inflate(R.layout.item_clipboard_clip, parent, false);

        // Return a new holder instance
        ViewHolder viewHolder = new ViewHolder(contactView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Clip clip = clips.get(position);
        holder.tvClipTitle.setText(clip.content);
    }

    @Override
    public int getItemCount() {
        return clips.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView tvClipTitle;

        public ViewHolder(View itemView) {
            super(itemView);

            tvClipTitle = itemView.findViewById(R.id.tvClipTitle);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }
}

【问题讨论】:

  • 稍微改一下代码行不行clips.add(clip); adapter.notifyItemInserted(clips.size - 1);
  • 为了简洁起见,我假设 MainActivity 已被删除。如果是这样,您是否拥有这两个集合中的任何一个 rvClips.setHasFixedSize(true)rvClips.setHasStableIds(true)
  • @avalerio 是的,我在这里只包括了必需品。但不,我没有这些。我应该吗?
  • @hientp 不会将项目添加到列表的末尾吗?我也想把它放在顶部
  • @PJDP no setHasFixedSize(true) 将是一个问题,如果实施不正确,setHasStableIds(true) 将是一个问题。你没有,所以不是问题。

标签: java android android-recyclerview


【解决方案1】:

既然你提到了“实时”,我猜这可能是一个线程问题。您的代码似乎正确。可能需要在 runOnUiThread 函数中刷新适配器。试试这个:

public void OnNewClipReceived(Clip clip) {
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
           clips.add(0, clip);
           adapter.notifyItemInserted(0);
        }
    });
}

【讨论】:

    【解决方案2】:

    您需要在 RecyclerView 适配器中使用此方法。

    void addNewClip(Clip clip, int index) {
        this.clips.add(index, clip);
        notifyItemInserted(index);
    }
    

    添加到剪辑(MainActivity)不会产生影响,因为您的适配器有自己的 ArrayList 可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2020-04-06
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2015-06-24
      相关资源
      最近更新 更多