【问题标题】:ListView setting background color to an item ERRORListView 将背景颜色设置为项目错误
【发布时间】:2015-04-19 06:30:19
【问题描述】:

嗯,我有一个水平线性布局,带有自定义类的项目。

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

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

【问题讨论】:

    标签: android listview android-listview background-color onitemclicklistener


    【解决方案1】:

    为什么不使用适配器进行修改?我想您正在使用自定义适配器?

    在你的适配器中

    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 之外时,视图都会被回收。

    【讨论】:

    • 用我的自定义适配器来做这件事就像一个魅力,真的很容易和简单。
    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2016-03-13
    • 2011-09-19
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多