【发布时间】:2018-05-03 17:11:07
【问题描述】:
我使用此tutorial 来创建自定义列表视图,但由于某种原因,它的行为与我的预期不同。
这是我更改并当前用于适配器的代码:
public View getView(int position, View convertView, ViewGroup parent) {
// same code as in example with some differences in the .xml
viewHolder.itemLabel.setText(info.split(";")[0]);
viewHolder.itemDescription.setText(info.split(";")[1]);
viewHolder.itemLabel.setOnClickListener(this);
viewHolder.itemLabel.setTag(position);
if(viewHolder.itemLabel.getText().equals("Fat")){
System.out.println(info);
System.out.println(viewHolder.itemLabel.getText());
viewHolder.itemLabel.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.info_icon, 0);
}
return convertView;
}
现在发生的情况是,由于某种原因,即使标签上只有一个带有“Fat”的项目,该图标也被设置为列表中的多个项目。
打印实际上显示 if 上的代码正在运行 3 次。
我认为这一定与应用程序的生命周期有关,但我不确定。
如果问题含糊不清,我很抱歉,但我找不到更好的方法来问这个问题。
【问题讨论】:
-
将else部分添加到
if(viewHolder.itemLabel.getText().equals("Fat"))。如果运行 3 次就可以了。通常getView()在第一次创建适配器时会调用几次。 -
为什么需要添加else?代码运行3次没有问题,唯一的问题是它把图标放在了错误的textviews上。
-
placing the icon on wrong textviews?这就是为什么您需要 else 部分将其设置为默认值的原因。阅读convertView在getView()中的角色。 -
@GuiFGDeo 能否请您分享屏幕短片,以便我们轻松解决。
-
我认为是因为回收视图行为。它使用先前创建的视图并添加为新视图。如果您不清除图标,则将添加回收视图中的图标