我在滚动时遇到以下项目背景问题。
在我的应用程序中,我有一个需要多选的 ListView 。这也是一个自定义列表,其中需要通过更改列表项颜色而不是基于复选框的方法来表示选择。 为此:在 OnClick 中,我检查是否选择了位置,然后设置项目的背景。但是,当我滚动列表时,这会出现问题。举个例子: 假设列表有 50 个项目。一次可以看到 10 个。我选择第 5 项 [从而改变背景]。然后我滚动列表。滚动对应于前面第 5 项的列表的可见部分后,说列表项中的第 15 项,但可见部分中的第 5 个索引,仍然有对应于选定状态的背景。而它不应该被设置,因为我还没有选择第 15 项。
我试过: a-在适配器的 getView 方法中,如果该项目不是所选项目之一,我将设置一个不同的背景。尝试过 - setBackgroundColor 以及 setBackgrounddrawable。 b- 在 xml 中将 cacheColorHint 设置为透明 c- 将选择器附加到项目,并且项目响应 onlcick 中的状态 [pressed,selected]。
但是我仍然无法摆脱滚动项目不需要的背景颜色。
任何帮助。我尝试了 SO 中各个帖子中提到的各种建议,但尚未成功。
我试过了
谢谢 普拉迪普
最佳答案
这是 Android 中 ListView 适配器的正常行为,它的 getView() 在每次滚动时调用,对于每个新的列表项它调用 getView,如果 listview 项当前在 UI 上不可见,那么它的 convertView 等于 null:在时间 ListView 仅加载可见列表项,如果它一次显示 50 个元素中的 10 个元素,则 listView.getChildCount() 将仅返回 10 个而不是 50 个。 在您选择 5 的情况下,它也反射(reflect)了 5+10(可见项目计数)= 15、25、35、45 的选择。 要解决这个问题,你应该有一个标志与你的每个 listItem 数据相关联,例如,如果你有字符串数组 itemData[50] 作为数组,然后取一个 boolean isSelected[50] 数组,每个数组的初始值为 false。
在适配器类中查看 getView():
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
string text = itemData[position]
if (convertView == null) {
rowLayout = (RelativeLayout) LayoutInflater.from(context)
.inflate(R.layout.list_view_item, parent, false);
holder = new ViewHolder();
holder.txtString= (TextView) rowLayout
.findViewById(R.id.txtTitle);
rowLayout.setTag(holder);
} else {
rowLayout = (RelativeLayout) convertView;
holder = (ViewHolder) rowLayout.getTag();
}
if(isSelected[position] == true){
holder.txtString.setText("Selected")
rowLayout.setBackGround(selected)
}else{
holder.txtString.setText("Not Selected")
rowLayout.setBackGround(notSelected)
}
public class ViewHolder {
public TextView txtString;
}
并在 listView.setOnItemClickListener() 上的 Activity 类中:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
isSelected[position] = true // on selection
RelativeLayout rowLayout = (RelativeLayout) view;
rowLayout.setBackGround(Selected);
// also set here background selected for view by getting layout refference
}
});
关于Android:列表滚动 ListView 项目背景问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195432/