【问题标题】:Change background color of an item in Android ListActivity onListItemClick更改 Android ListActivity onListItemClick 中项目的背景颜色
【发布时间】:2012-09-26 21:27:03
【问题描述】:

我知道这听起来很简单,并且对此存在疑问。但没有一个能解决我的问题。所以我们开始:

我想在用户单击 ListActivity 时更改列表项的背景颜色,并在用户再次单击时将其更改回原始颜色(即选择/取消选择项目的外观)

我尝试使用 getChildAt,如果我在一个屏幕上显示所有项目而无需滚动,它就可以完美运行。

代码:

getListView().getChildAt(position).setBackgroundColor(Color.CYAN);

当我在列表中有更多项目并且用户必须滚动浏览它们时,问题就开始了。更改项目的背景后,当我滚动时,背景颜色会显示在新可见的项目上。此外,当再次单击该项目时,getChildAt(position) 返回 null(因此返回 NullPointerException)。

谁能帮我一个简单的代码来帮助我改变列表项的背景颜色?

提前致谢!

【问题讨论】:

标签: android listview listactivity


【解决方案1】:

当然。我会在自定义ListAdaptergetView() 方法中执行此操作。

MyAdapter extends SimpleAdapter {
    private ArrayList<Integer> coloredItems = new ArrayList<Integer>();

    public MyAdapter(...) {
        super(...);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        if (coloredItems.contains(position)) {
            v.setBackgroundColor(Color.CYAN);
        } else {
            v.setBackgroundColor(Color.BLACK); //or whatever was original
        }

        return v;
    }
}

单击列表项时更新coloredItems

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    if (coloredItems.contains(position)) {
        //remove position from coloredItems
        v.setBackgroundColor(Color.BLACK); //or whatever was original
    } else {
        //add position to coloredItems
        v.setBackgroundColor(Color.CYAN);
    }
}

【讨论】:

  • 太棒了!那工作简直太完美了!我很难找出解决方案。你的回答很有帮助。希望我能给你两个投票... :) 再次感谢! :)
  • 经过几个小时的死胡同,你给我指明了正确的道路,干得好!
【解决方案2】:

如果您正在与ListFragment 打交道,那么这段代码会很有帮助,

  @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (view != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            getListView().setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
            catagoryValueListView=getListView();
            catagoryValueListView.setOnItemClickListener(new OnItemClickListener() {

             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 if (ColoredView != null)
                     ColoredView.setBackgroundColor(Color.WHITE); //original color

                 view.setBackgroundColor(Color.BLUE); //selected color
                 ColoredView = view;
                                  }
        });
    }

}

【讨论】:

  • 请更新您的答案并在代码标签中粘贴您的代码。
【解决方案3】:

我要做的是创建一个名为 list_background 的 xml 文件并将其放入可绘制文件夹中。

xml 看起来像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@color/list_selected" android:state_pressed="true" />
   <item android:drawable="@android:color/white" />
</selector>

在 ListView 项目的 xml 代码中,我将此 xml 作为项目背景,即

item.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          style="@style/Fill"
          android:background="@drawable/list_background">

     <!-- Your layout here -->
</RelativeLayout>

style=@style/Fill 只是我做的一个捷径 android:layout_height="match_parent" 和 android:layout_width="match_parent

然后在onListItemCLick:

public void onListItemClick(ListView l, View v, int position, long id) {
    v.setPressed( !v.isPressed ) //Toggle between colors of the view
}

【讨论】:

  • 感谢您的帮助!但是这个解决方案有两个问题:1)您一次只能选择一个项目,如果您尝试选择另一个项目,第一个项目会自动失去它的背景颜色。 2)如果你选择了一个项目,向下滚动然后向上滚动,你看到的是被选中的项目现在没有背景颜色了! :(请帮忙。谢谢!
  • 是的,您需要修改 ListAdapter 的 getView 方法以保持该状态(请参阅下面的答案)。因为 ListView 重用了项目视图,所以出现在顶部(滚动后)的项目可能会继承留在底部的项目的特征,除非这些特征在 getView 中重置。
  • @heycosmo:如果我不使用自己的 ListAdapter 怎么办?因为我使用的是 SimpleAdapter。我该如何解决这个问题?
  • @SurajBajaj 子类 SimpleAdapter 并覆盖 getView。我会根据这个细节更新我的答案。
【解决方案4】:

你可以在onListItemClick方法中这样做

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    for (int a = 0; a < l.getChildCount(); a++) {
        l.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
    }

    ColorDrawable colorDrawable1 = new ColorDrawable(
            Color.parseColor("#A0A3A0"));
    v.setBackgroundDrawable(colorDrawable1);   

    if (position == 0) {
        Intent i = new Intent(MainActivity.this, NewActivity.class);

        startActivity(i);
    }

}

【讨论】:

    【解决方案5】:

    我就是这样做的:

    创建一个全局变量View ColoredView;那么当你 setOnItemClickListener 为你的 ListView 时,这样做:

    MenuList.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    if (ColoredView != null)
                        ColoredView.setBackgroundColor(Color.WHITE); //original color
    
                    view.setBackgroundColor(Color.BLUE); //selected color
                    ColoredView = view;
                }
            });
    

    这是我认为最简单的方法。

    【讨论】:

      【解决方案6】:

      感谢 heycosmo。你的解决方案解决了我的问题。

      不知道为什么我们应该在两个地方设置背景。

      1. Adapter的getView()

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
           ....
           ....
           ....
              if(arrayBools[position]) {
                  view.setBackgroundColor(Common.colorBkgroundSelected);
              }
              else{
                  view.setBackgroundColor(Common.colorBkgroundNormal);            
              } 
           ....
           ....
           ....
      }
      

      2。 ListActivity 的 onListItemClick()。

      @Override
      protected void onListItemClick(ListView l, View v, int position, long id) {
            super.onListItemClick(l, v, position, id);       
            arrayBools[position] = ( arrayBools[position] ? false : true );
      
           if(arrayBools[position]) {
               v.setBackgroundColor(colorBkgroundSelected);
           }
           else{
              v.setBackgroundColor(colorBkgroundNormal);          
           }    
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 2021-11-22
        相关资源
        最近更新 更多