Change background color of an item in Android ListActivity onListItemClick

后端 未结 6 1040
醉酒成梦
醉酒成梦 2021-02-14 09:12

I know it sounds very simple, and there are questions about this. But none of it could solve my problem. So here we go:

I want to change background color of a list item

相关标签:
6条回答
  • 2021-02-14 09:12

    If you are dealing with ListFragment then this code will be helpful,

      @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;
                                      }
            });
        }
    
    }
    
    0 讨论(0)
  • 2021-02-14 09:19

    Sure thing. I would do this in the getView() method of a custom ListAdapter.

    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;
        }
    }
    

    Update coloredItems when a list item is clicked.

    @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);
        }
    }
    
    0 讨论(0)
  • 2021-02-14 09:22

    Thanks heycosmo. your solution solved my problem.

    Have no clue why we should set background in 2 places.

    1. Adapter's 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's 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);          
         }    
    }
    
    0 讨论(0)
  • 2021-02-14 09:26

    this is how I did it:

    create a global variable View ColoredView; then when you setOnItemClickListener for your ListView, do this:

    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;
                }
            });
    

    it's the simplest way in my opinion.

    0 讨论(0)
  • 2021-02-14 09:33

    Simply you can do it like this in onListItemClick method

    @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);
        }
    
    }
    
    0 讨论(0)
  • 2021-02-14 09:34

    What I do is I create an xml file called i.e. list_background and put it in the drawable folder.

    The xml looks like this:

    <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>
    

    And in the xml code for the ListView's item I put this xml as the items background i.e.

    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 is only a short cut i made for android:layout_height="match_parent" and android:layout_width="match_parent

    Then in onListItemCLick:

    public void onListItemClick(ListView l, View v, int position, long id) {
        v.setPressed( !v.isPressed ) //Toggle between colors of the view
    }
    
    0 讨论(0)
提交回复
热议问题