android - Hint about a visual checked state in ListView -


i'm quite new android , don't understand how achieve goal. it's pretty simple, though.

i created sliding menu, using drawerlayout (api level 16). here placed listview shows custom layout (an imageview way). there selector change background according checked state of each item.

the user should toggle each item: when 1 checked background should change color.

with code below can "select" 1 item, mean background changes (to list_item_bg_checked) when user click on item, regardless checked state (stored active variable of navdraweritem).

please, put me on right way?

activity_content.xml

<android.support.v4.widget.drawerlayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/drawer_layout"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:layout_gravity="left"     android:layout_alignparentleft="true">      <listview         android:id="@+id/list_slidermenu"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="left|center_vertical"         android:choicemode="multiplechoice"         android:divider="@color/list_divider"         android:dividerheight="10dp"         android:listselector="@drawable/list_selector"         android:background="#00000000"/>  </android.support.v4.widget.drawerlayout> 

drawer_list_item.xml

<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="98dp"     android:layout_height="150dp"     android:background="#00000000">      <imageview         android:id="@+id/icon"         android:layout_width="98dp"         android:layout_height="150dp"         android:layout_alignparentleft="true"         android:layout_marginleft="12dp"         android:layout_marginright="12dp"         android:contentdescription="@string/desc_list_item_icon"         android:layout_centervertical="true" />  </relativelayout> 

list_selector.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:drawable="@drawable/list_item_bg_normal"  />     <item android:drawable="@drawable/list_item_bg_checked" android:state_checked="true"/> </selector> 

contentactivity.java

package my.own.package;  import android.app.activity; import android.content.res.typedarray; import android.os.bundle; import android.os.handler; import android.support.v4.widget.drawerlayout; import android.util.log; import android.view.gravity; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.adapterview; import android.widget.listview; import android.widget.mediacontroller; import android.widget.videoview;  import java.util.arraylist;  import my.own.package.slidingmenu.adapter.navdrawerlistadapter; import my.own.package.slidingmenu.model.navdraweritem;  public class contentactivity extends activity {     private static final string tag = contentactivity.class.getsimplename();     public static final int option_1 = 0;     public static final int option_2 = 1;     public static final int option_3 = 2;      private drawerlayout mdrawerlayout;     private listview mdrawerlist;      private typedarray navmenuicons;     private arraylist<navdraweritem> navdraweritems;     private navdrawerlistadapter adapter;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_content);          navmenuicons = getresources().obtaintypedarray(r.array.nav_drawer_icons);          mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout);         mdrawerlist = (listview) findviewbyid(r.id.list_slidermenu);          navdraweritems = new arraylist<navdraweritem>();         navdraweritems.add(new navdraweritem(navmenuicons.getresourceid(0, -1)));         navdraweritems.add(new navdraweritem(navmenuicons.getresourceid(1, -1)));         navdraweritems.add(new navdraweritem(navmenuicons.getresourceid(2, -1)));          // init variable's state         navdraweritems.get(option_1).setactive(false);         navdraweritems.get(option_2).setactive(true);         navdraweritems.get(option_3).setactive(false);          navmenuicons.recycle();         adapter = new navdrawerlistadapter(getapplicationcontext(), navdraweritems);         mdrawerlist.setadapter(adapter);         mdrawerlist.setonitemclicklistener(new slidemenuclicklistener());          // init checked state of items         mdrawerlist.setitemchecked(option_1, navdraweritems.get(option_1).getactive());         mdrawerlist.setitemchecked(option_2, navdraweritems.get(option_2).getactive());         mdrawerlist.setitemchecked(option_3, navdraweritems.get(option_3.getactive());      }      private class slidemenuclicklistener implements listview.onitemclicklistener {         @override         public void onitemclick(adapterview<?> parent, view view, int position, long id) {             final navdraweritem item = (navdraweritem) mdrawerlist.getitematposition(position);             item.setactive(!item.getactive());             mdrawerlist.setitemchecked(position, item.getactive());            }     } } 

you can keep track position of current selected element:

 onitemclicklistener listviewonitemclick = new onitemclicklistener() {          @override         public void onitemclick(adapterview<?> adapter, view arg1, int position, long id) {                 mselecteditem = position;                 madapter.notifydatasetchanged();         }     }; 

and override getview method of adapter:

 @override     public view getview(int position, view convertview, viewgroup parent) {         final view view = view.inflate(context, r.layout.item_list, null);          if (position == mselecteditem) {             // set color         }          return view;     } 

Comments