我正在尝试动态添加id Object { id=23}
中的项目。当我第一次这样做(所以列表是空的)时,ListView
工作得很好,convertView是getView()
,因为它应该是,所以我可以使用null
来存储引用到项目的视图并通过setTag()将其绑定到视图。但是当我使用数据向列表中添加第二个项目并调用ViewHolder
时,我们注意到了奇怪的行为。
基本上,notifyOnDataSetChanged()
会重新绘制所有可见项目,并从第一个可见项目开始。问题是,当重绘第一个项目(之前已经绘制过)时,convertView == null,所以我需要为它添加新视图并使用notifyOnDataSetChanged()
查找我已找到的所有引用之前并存储在ViewHolder中。对于第二个项目,我收到了引用第一个项目的convertView,所以我需要为第二个项目找到它。我想要的是获取第一个项目之前创建的视图(并在其ViewHolder中包含所有引用),并为第二个项目创建新视图,即在绘制刚刚添加的项目时使用convertView == null。有没有办法做到这一点?
编辑1:添加新项目:
findViewById()
ArrayAdapter:
alarmClocksList.add(new AlarmClock(time, songTitle, weekDaysPanelVisible, weekDaysOn));
alarmsArrayAdapter.notifyDataSetChanged();
答案 0 :(得分:1)
您应该使用Recyclerview来支持ListView。使用Recyclerview,可以更精确地将数据阵列中的更改发布到GUI,例如RecyclerView.Adapter.notifyItemInserted
或RecyclerView.Adapter.notifyItemChanged
。
答案 1 :(得分:1)
您要实现的目标基本上是优化ListView
缓存解决方案,您不能也不应该这样做。您的ViewHolder
实现应该与ListView
缓存的工作方式无关。确保您的代码在任何情况下都能正常运行,并将缓存逻辑保留为ListView
。