在 ListView 中单击时,项目 ImageButton 可绘制更改似乎一次更改 2 个项目
Items ImageButton drawable change upon click in ListView seems to change for 2 items at a time
我知道之前有人问过这个问题,并且大致了解了发生的事情,但我似乎找不到解决方案。
在我的自定义列表适配器中和内部 public View getView(int position, View convertView, ViewGroup parent) {
我为项目 ImageButton 设置了点击功能。
final ImageButton bookmark = (ImageButton)
convertView.findViewById(R.id.bookmarkthis);
bookmark.setTag(position);
bookmark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
}
});
Imagebutton 是一颗透明的星形按钮,当单击它时,它会将同一个可绘制对象更改为黄色星形。没问题。
问题是当我单击位置 0 星形图标中的项目使其变为黄色时,它也会更改列表下方的项目 8,但尚未在视图中。如果我点击位置 1,位置 9 也会发生变化,依此类推。
我环顾四周并研究了这个问题,甚至尝试了 Imagebutton 的支架,但没有成功。某些东西阻止了 ImageButton 的可绘制更改到其正确的位置。
谢谢
解决方法是先在数组中为每个Item设置一个标志项。然后 onClick 仅针对该项目将标志设置为 true。然后在 getView 中,它只是一个 if 语句的例子,用于在项目被循环时检查标志。
//in array creation
items.setFlag("false");
//in getView as you set Text and what ever get the Flag state
String flag = m.getFlag();
//check the flag state and take action in this case change the icon accordingly
if (Objects.equals(flag, "true")) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
}
else {
bookmark.setImageResource(R.drawable.ic_bookmark);
}
// and in the click function
@Override
public void onClick(View v) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
m.setFlag("true");
}
您需要重置您的 bookmark
图像资源和标签值,一个非空的 convertView
被传递给 getView
。您的 onClick
处理程序正在将它们设置为这些值:
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
因此您需要在显示新列表项时将它们重置为默认值。
ListView 重用超出范围的视图。重用视图时,您不会重置 "bookmark" 图标(当您获得非空 convertView
时)。确保始终将视图的所有属性重置为正确的值,这样就不会出现问题。
我知道之前有人问过这个问题,并且大致了解了发生的事情,但我似乎找不到解决方案。
在我的自定义列表适配器中和内部 public View getView(int position, View convertView, ViewGroup parent) {
我为项目 ImageButton 设置了点击功能。
final ImageButton bookmark = (ImageButton)
convertView.findViewById(R.id.bookmarkthis);
bookmark.setTag(position);
bookmark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
}
});
Imagebutton 是一颗透明的星形按钮,当单击它时,它会将同一个可绘制对象更改为黄色星形。没问题。
问题是当我单击位置 0 星形图标中的项目使其变为黄色时,它也会更改列表下方的项目 8,但尚未在视图中。如果我点击位置 1,位置 9 也会发生变化,依此类推。
我环顾四周并研究了这个问题,甚至尝试了 Imagebutton 的支架,但没有成功。某些东西阻止了 ImageButton 的可绘制更改到其正确的位置。
谢谢
解决方法是先在数组中为每个Item设置一个标志项。然后 onClick 仅针对该项目将标志设置为 true。然后在 getView 中,它只是一个 if 语句的例子,用于在项目被循环时检查标志。
//in array creation
items.setFlag("false");
//in getView as you set Text and what ever get the Flag state
String flag = m.getFlag();
//check the flag state and take action in this case change the icon accordingly
if (Objects.equals(flag, "true")) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
}
else {
bookmark.setImageResource(R.drawable.ic_bookmark);
}
// and in the click function
@Override
public void onClick(View v) {
bookmark.setImageResource(R.drawable.ic_bookmarked);
m.setFlag("true");
}
您需要重置您的 bookmark
图像资源和标签值,一个非空的 convertView
被传递给 getView
。您的 onClick
处理程序正在将它们设置为这些值:
bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);
因此您需要在显示新列表项时将它们重置为默认值。
ListView 重用超出范围的视图。重用视图时,您不会重置 "bookmark" 图标(当您获得非空 convertView
时)。确保始终将视图的所有属性重置为正确的值,这样就不会出现问题。