我有一个带有自定义适配器的ListView。在每一行中都有一个只在某些约束条件下可见的ImageView。问题是,如果第一行显示此ImageView,那么它也适用于最后一行,反之亦然。
以下是我的适配器的getView()
代码。
public View getView(int position, View view, ViewGroup parent) {
if (view == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_idea, null);
}
Idea idea = mIdeas.get(position);
if (idea != null) {
ImageView imgAlarm = (ImageView) view
.findViewById(R.id.imgAlarm_rowIdea);
if (idea.getTimeReminder() != null)
imgAlarm.setVisibility(ImageView.VISIBLE);
TextView lblTitle = (TextView) view
.findViewById(R.id.lblTitle_rowIdea);
lblTitle.setText(idea.getTitle());
TextView lblDescription = (TextView) view
.findViewById(R.id.lblDescription_rowIdea);
lblDescription.setText(idea.getDescription());
}
return view;
}
mIdeas
是ArrayList
,其中包含要在ListView
中显示的所有数据。
imgAlarm
是我在上面说过的ImageView
。
答案 0 :(得分:2)
如果条件不满足,您将需要还原ImageView
的可见性状态,这样您就不会遇到潜在的回收视图问题(可能已ImageView
已显示当它不应该出现时:)
if (idea.getTimeReminder() != null) {
imgAlarm.setVisibility(ImageView.VISIBLE);
} else {
imgAlarm.setVisibility(ImageView.INVISIBLE); // or GONE
}
答案 1 :(得分:2)
更改
if (idea.getTimeReminder() != null)
imgAlarm.setVisibility(ImageView.VISIBLE);
到
if (idea.getTimeReminder() != null)
imgAlarm.setVisibility(ImageView.VISIBLE);
else
imgAlarm.setVisibility(ImageView.GONE);
这里发生的是适配器正在“回收”视图。因此,如果您在测试中看到,最后一个视图和第一个视图实际上是同一个实例。