晚上好StackOverflow
这次我正在与一个包含TextViews的ListView进行斗争。
我添加一个OnItemClick侦听器。
v.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
TextView tvItm = (TextView) arg1;
int Col = tvItm.getTextColors().getDefaultColor();
if (Col == Color.WHITE)
tvItm.setTextColor(Color.GREEN);
else
tvItm.setTextColor(Color.WHITE);
}
});
正如你所看到我切换文本的颜色,它可以工作..但是,它一次可以处理几个项目,即使我只点击一个项目。因此,当我点击第一个项目时,它变为绿色,然后有六个白色项目,第7个项目是绿色,但我从未点击过第7个项目!!
第1项 - 点击 - 绿色
item2 - 未点击 - 白色
item3 - 未点击 - 白色
item4 - 未点击 - 白色
item5 - 未点击 - 白色
item6 - 未点击 - 白色
item7 - 未点击 - 绿色
item8 - 未点击 - 白色
item9 - 未点击 - 白色
等...
这种模式继续存在于所有列表中。
此外,如果我快速上下快速移动列表,则模式会向上或向下移动1到2个项目。
这是一个截图:
第一张图片:什么都没做 第二张图片:我点击了'AK Kusine' 第三张图片:我向下滚动,'Allan Malka'也被更改了..
如果我在监听器中设置断点,则每次单击列表时只会停止一次。 是什么导致这种行为?更重要的是,我该如何解决?
答案 0 :(得分:1)
这是因为getView
方法会回收您的视图以优化性能。
在适配器中实现getView(int position, View convertView, ViewGroup parent)
方法(因此需要扩展适配器),使其获得convertView
并根据位置将其设置为绿色或白色。
观看this以获取详细说明。它可能看起来很长,但它非常有用。
答案 1 :(得分:0)
这可能是由于重新绘制ListView时搞砸了一些东西。一般来说,如果你只是在你的数据上设置某种标志表明它应该是绿色,那就更好了,然后在你的ListView.getView()中你会有这样的东西
if(listItem.isGreen())
view.setColor(Color.GREEN);
答案 2 :(得分:0)
我相信它因为android重用listview中的视图来最小化内存占用。当您选择列表中显示的第一个项目时,其textview设置为绿色,但是当您滚动列表并且第一个项目不可见时,实际上它再次显示为您的第7个项目并且仍将其文本设置为绿色。为避免这种情况,您可以简单地(默认情况下)将您的textview设置为适配器的getView
中的白色并希望它能够正常工作