ListView 将背景颜色设置为项目错误

ListView setting background color to an item ERROR

嗯,我有一个水平的 LinearLayout,带有自定义项 class。

我想要的: 更改我单击的项目的背景颜色(就像它被选中一样)。如果用户点击其他项目,第一个再次变为原始颜色,新的变为 "selected color"

我的问题是什么: 当 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);   
            }                                       
});

为什么不使用适配器进行修改?我想你使用的是自定义适配器?

在你的适配器中

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();
        }                                       
});

而且我注意到您在 itself.Maybe 中使用自定义列表视图查看库的实现以检查干扰?

编辑:你的问题的原因很可能是 dude to view recycling.The 背景颜色没有得到更新,因为每次列表项在你的 ViewPort 之外,视图都会被回收。