我有一个绘制所选项目视图的方法,但是如果我的ListView有滚动(我的意思是:如果我的屏幕可以显示9"行" - 位置 - 并且总大小大于9 )我选择前九个位置中的一个,它将选择我选择的位置和一个从最后位置(我需要滚动查看的位置)。
示例:如果我选择选择位置0并绘制它,将绘制位置0和位置11上的视图。
如果我尝试:
getListView().getChildAt(int)
如果此位置类似于' 12',它将返回null,因此我使用我在onItemLongClick(AdapterView adapterView,View v,int position,long arg3)时获得的视图是调用。看起来View基于滚动,因为我有相同的View对象用于滚动位置。
以下是我绘制视图的方式:
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View v,
int position , long arg3) {
Log.d("", "");
View tmp = adapterView.getChildAt(position);
int oi = adapterView.getSelectedItemPosition();
if(!mPositions.contains(Integer.valueOf(position))){
v.setBackgroundColor(Color.CYAN);
mViews.add(v);
mPositions.add(Integer.valueOf(position));
} else {
v.setBackgroundColor(Color.TRANSPARENT);
mViews.remove(v);
mPositions.remove(Integer.valueOf(position));
}
return true;
}
});
如果列表大于我的屏幕,我怎样才能独立获得不同的视图?
答案 0 :(得分:1)
这里的问题是你真的不应该直接修改视图。 ListView的重点是它将为一个项创建一个视图,然后可能使用同一个视图来绘制列表中的每个项。 (行回收)。在这里,当您修改所选项目视图的背景颜色时,此视图对象实际上被用于绘制另一行的项目 - 看起来就像它正在做的那样对于错误的行。
您应该做的是使用您自己的getView()实现创建自定义适配器。在这个函数中你将做两件事之一:如果convertView为null,那么创建你想要的View(可能是TextView?),否则你将从convertView中获取视图。最后,您将根据它在列表中的位置设置此视图。即:如果是文本,请设置值,然后设置背景。
要响应longpress,只需更改数据(mSeleted)并调用notifyDataSetChanged(),以便根据此新数据重绘列表。
这是一个非常简单的概述,列表视图可以根据需要变得复杂。如果您搜索,有很多关于如何在网络上创建自定义列表视图的示例。