【问题标题】:ListView: how to access a view from the list to change the background color?ListView:如何从列表中访问视图以更改背景颜色?
【发布时间】:2014-04-15 19:00:37
【问题描述】:

我有一个使用自定义字符串适配器的 ListView,因此我可以更改字体和文本类型。但是,我希望列表中的选定项目具有与其他项目不同的背景颜色。

我使用 onItemClick 侦听器,通过它我可以更改所选项目的颜色。但我不知道如何将先前选择的选项的颜色改回来。代码如下:

    schemelist = new ListView(context);
    AuxClasses.CustomAdapter adapter = new AuxClasses.CustomAdapter(context,android.R.layout.simple_list_item_1,Aux.FontMastermind,Aux.WhiteColor,14);
    adapter.addAll(Aux.SchemeList);
    schemelist.setAdapter(adapter);
    schemelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            view.setBackgroundColor(selection_color);
            //Change the background color of the previously selected item.

        }
    });

我想我需要访问先前选择的项目的视图,但是我不知道如何访问特定位置的视图。

有什么想法吗?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    两种方式:

    更容易&推荐。老实说,我什至不认为这会奏效。好吧,你可以试一试:

    保留一个班级成员previouslySelectedView

    View previouslySelectedView;
    
    ....
    
    schemelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
         @Override
         public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
             if (previouslySelectedView != null) {
                 previouslySelectedView.setBackgroundColor(ORIGINAL_COLOR);
             }
    
             view.setBackgroundColor(selection_color);
    
             previouslySelectedView = view;
    
        }
    });
    

    推荐方式:

    在你的适配器中声明一个变量mSelectedPosition

    int mSelectedPosition = -1;
    

    mSelectedPosition写一个setter

    public void setSelectedPosition(int pos) {
        mSelectedPosition = pos;
        notifyDataSetChanged();
    }
    

    在您的 getView(....) 方法中,检查当前位置是否为选中位置:

    if (curPos == mSelectedPosition) {
        convertView.setBackgroundColor(selection_color);
    } else {
        convertView.setBackgroundColor(ORIGINAL_COLOR);
    }
    

    现在,您需要在 onItemClick(....) 内部做的所有事情:

    schemelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            adapter.setSelectedPosition(i);
         }
    });
    

    就是这样。您需要将adapter 声明为final

    【讨论】:

    • 谢谢!!!我使用第二种方法就像一个魅力。我试过了。但我从未见过 notifyDataSetChanged();命令。
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多