ListView:如何从列表中访问视图以更改背景颜色?

Posted

技术标签:

【中文标题】ListView:如何从列表中访问视图以更改背景颜色?【英文标题】:ListView: how to access a view from the list to change the background color? 【发布时间】: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.

        
    );

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

有什么想法吗?

【问题讨论】:

【参考方案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();命令。

以上是关于ListView:如何从列表中访问视图以更改背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

Android在listview中设置单项背景颜色

Flutter - 如何访问 ListView.builder 中的一个元素?

如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色

如何更改android ListView中特定行的样式

如何选择/突出显示列表视图中的项目而不触摸它?

在活动中更改列表视图的按钮可见性