【发布时间】: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