当我向listView添加新项时,getVIew的已存在项的convertView == null

时间:2016-08-05 13:30:48

标签: android listview

我正在尝试动态添加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();

2 个答案:

答案 0 :(得分:1)

您应该使用Recyclerview来支持ListView。使用Recyclerview,可以更精确地将数据阵列中的更改发布到GUI,例如RecyclerView.Adapter.notifyItemInsertedRecyclerView.Adapter.notifyItemChanged

答案 1 :(得分:1)

您要实现的目标基本上是优化ListView缓存解决方案,您不能也不应该这样做。您的ViewHolder实现应该与ListView缓存的工作方式无关。确保您的代码在任何情况下都能正常运行,并将缓存逻辑保留为ListView