【问题标题】:ListView: Why doesn't the background change the first time?ListView:为什么第一次背景没有变化?
【发布时间】:2017-01-30 17:50:11
【问题描述】:

我需要一种方法来更改所选项目的背景颜色。下面的代码仅在我第二次单击某个项目时更改背景颜色(蓝色)。因此,当我第一次单击某个项目时,它不起作用。

final SongAdapter songAdt = new SongAdapter(getApplicationContext(), songList);
lv.setAdapter(songAdt);

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.i(TAG, " executed");
            view.setBackgroundColor(Color.BLUE);
        }
    }
);

我刚刚检查过(通过使用 Log.i 函数)代码执行了 2 次,但只有第二次更改了背景。为什么?

【问题讨论】:

  • 您能否通过将整个代码提供给列表视图来详细说明问题?
  • 很可能视图不会重绘。拥有完整的源代码将有助于了解为什么会发生这种情况。
  • 我在上面的问题中添加了一些代码,你到底需要什么部分?谢谢:)
  • @jackgu1988 我在上面添加了更多代码:)
  • @OBX 我在上面添加了更多代码:)

标签: android android-layout listview


【解决方案1】:

试试这个:

private int prevPosition=-1;

和你的onItemClick 使用:

lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapter, View view,
            int position, long arg3) {

        for (int i = 0; i < adapter.getChildCount(); i++) {
            if (i == position) {   

                if(position!=prevPosition){
                   //set your selected color                    
                   adapter.getChildAt(i).setBackgroundColor(Color.BLUE);
                    prevPosition=position;

                }else{
                    adapter.getChildAt(i).setBackgroundColor(Color.BLACK);
                    prevPosition=-1;
                   }

               }else{
                  //set your normal color   
                  adapter.getChildAt(i).setBackgroundColor(Color.BLACK);

               }

            }
    }

});

选项 2

您可以为 listview 使用可绘制选择器

res/drawable 文件夹中

背景.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" 
    android:drawable="@drawable/pressed" />
<item  android:state_focused="false" 
    android:drawable="@drawable/normal" />
</selector>

pressed.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#000000"/>  // set your selected color   
<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
</shape>

正常.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FFFFFF"/>    

<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
</shape>

现在在你的listview in xml 中使用它:

android:listSelector="@drawable/background" 

【讨论】:

  • 这对于音乐播放器来说可能效率不高。它会减慢大型歌曲列表中的速度。
  • 编辑看起来不错,过去类似的东西对我有用。但是我不确定它是否会起作用,因为 OP 说这不起作用:stackoverflow.com/questions/41936272/…
  • 它有效..对我来说..尝试并删除您的view.setBackgroundColor(Color.BLUE);view.setSelected(true); onItemClick
  • @rafsanahmad007 我刚刚尝试了方法 2,但它不起作用。你能告诉我为什么吗?
  • 在第一次点击或第二次点击时它没有改变背景?
【解决方案2】:

在列表视图中,我们有属性 android:listSelector="@color/sky" 在 xml 中使用它。这将改变所选项目的背景。希望这对你有用。

【讨论】:

  • 我已经尝试过了,你可以在这里看到:stackoverflow.com/questions/41936272/… 但它不起作用,我不知道为什么。
  • android:choiceMode="singleChoice" 在你的列表视图中试试这个@xRobot
【解决方案3】:

删除线

view.setBackgroundColor(Color.BLUE);

并添加这一行,看看是否有效

parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.list_blue_colour));

我还没有测试过,如果工作请分享,如果不工作请关注这个答案over here

【讨论】:

  • 它说 getColor 已被弃用
  • 尝试改用setBackgroundColor(Color.BLUE); 看看
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2023-01-15
相关资源
最近更新 更多