好吧,我有一个水平的LinearLayout,包含自定义类的项目。
我想要的是什么:更改我点击的项目的背景颜色(如果已选中)。如果用户点击其他项目,则第一个项目将再次更改为原始颜色,新的项目将更改为"所选颜色"
我的问题是什么:当listView的所有项目都适合屏幕(在本例中为3项)时,此方法正常。如果有更多项目,让我们说7,如果用户点击项目编号0,它会改变颜色,但如果用户滚动到最后一项并点击项目编号6,它会改变颜色,但项目0不会改变颜色。改变。如果两个项目都可见,则可以正常工作。
这是我的onItemClickListener的代码。
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
for(int i=0;i<listView.getCount();i++){
try{
getViewByPosition(i, listView).setBackgroundResource(R.drawable.skin);
listView.getChildAt(i).setBackgroundResource(R.drawable.skin);
}
catch(Exception e){
System.out.println(e.toString());
}
}
view.setBackgroundResource(R.drawable.skin_selected);
}
});
答案 0 :(得分:0)
为什么不使用适配器进行修改?我假设您使用的是自定义适配器?
你适配器中的
public int selectedItem;
.
//Rest of the stuff
.
.
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (null == convertView) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
}
if(selectedItem==position){
convertView.setBackgroundResource(R.drawable.skin_selected);
}else{
convertView.setBackgroundResource(R.drawable.skin);
}
return convertView;
}
并且您的onclick监听器变为:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
((NameOfYouAdpater)listView.getAdapter()).selectedItem=position;
((NameOfYouAdpater)listView.getAdapter()).notifyDataSetChanged();
}
});
我注意到你正在使用自定义列表视图。可以查看库的实现以检查干扰吗?
编辑:您的问题的原因很可能是查看回收的背景。背景颜色不会更新,因为每次列表项在ViewPort之外时,视图都会被回收。