Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

In my application i am using a navigation drawer with list view.Now what i want is that when user selects a list item the color of the list item should change and also it should remain selected.With some research i am able to change the list item to desired color but it does not remains selected.

List selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:state_pressed="true" android:drawable="@color/pink" />
    <item android:state_enabled="true"
        android:state_focused="true" android:drawable="@color/pink" />
    <item android:state_enabled="true"
        android:state_selected="true" android:drawable="@color/pink" />
    <item
        android:drawable="@android:color/white" />

</selector>

ListView.xml

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="#fff"
        android:layout_weight="3">

        <ListView
            android:id="@+id/lv_nav_items"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:listSelector="@android:color/transparent"
            android:paddingBottom="05dp"></ListView>


    </LinearLayout>

Code onItemClick

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



        lvNavItems.setItemChecked(position, true);
        lvNavItems.setSelection(position);
        mDrawerLayout.closeDrawer(fragContainer);


    }

DrawerClass

public class NavigationDrawerFrag extends MasterFragment implements AdapterView.OnItemClickListener {

    private View view;
    private View fragContainer;

    private ActionBarDrawerToggle drawerToggle;
    private DrawerLayout mDrawerLayout;
    private List<NavItems> listNavItems;
    private int[] icons = new int[]{R.drawable.ic_home_r, R.drawable.ic_profile, R.drawable.ic_celebrities, R.drawable.ic_verify, R.drawable.ic_about_us, R.drawable.ic_tc, R.drawable.ic_home, R.drawable.ic_home, R.drawable.ic_cancellation, R.drawable.ic_logout};
    private int[] iconsColored = new int[]{R.drawable.ic_home, R.drawable.ic_profile_r, R.drawable.ic_celebrities_r, R.drawable.ic_verify_r, R.drawable.ic_about_us_r, R.drawable.ic_tc_r, R.drawable.ic_home_r, R.drawable.ic_home_r, R.drawable.ic_cancellation_r, R.drawable.ic_logout_r};
    private String[] items;

    private ListView lvNavItems;
    private NavItemAdapter adapter;

    public NavigationDrawerFrag() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.navigation_drawer_frag, container, false);
        return view;
    }

    public void setUp(DrawerLayout drawerLayout, Toolbar toolbar, int fragId) {

        fragContainer = getActivity().findViewById(fragId);

        mDrawerLayout = drawerLayout;
        drawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.open, R.string.close) {

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActivity().invalidateOptionsMenu();
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                getActivity().invalidateOptionsMenu();
            }
        };

        mDrawerLayout.setDrawerListener(drawerToggle);

        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {

                drawerToggle.syncState();
            }
        });

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        init();
    }

    private void init() {

        lvNavItems = (ListView) view.findViewById(R.id.lv_nav_items);
        items = getActivity().getResources().getStringArray(R.array.NavItems);

        adapter = new NavItemAdapter(getActivity(), getListItems());
        lvNavItems.setAdapter(adapter);

        lvNavItems.setItemChecked(2, true);
        lvNavItems.setSelection(2);

        lvNavItems.setOnItemClickListener(this);


    }


    public List<NavItems> getListItems() {

        listNavItems = new ArrayList<>();

        for (int i = 0; i < icons.length && i < items.length; i++) {

            NavItems navItems = new NavItems(items[i], icons[i]);
            listNavItems.add(navItems);

        }

        return listNavItems;
    }


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


        CommonFunctions.replaceFragment(getActivity(), new ProfileFrag(), true);
        lvNavItems.setItemChecked(position, true);
        lvNavItems.setSelection(position);
        mDrawerLayout.closeDrawer(fragContainer);


    }
}

Custom list item

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_selector"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_nav_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:padding="10dp"
        android:src="@drawable/ic_home" />

    <TextView
        android:id="@+id/tv_nav_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/iv_nav_icon"
        android:layout_toRightOf="@+id/iv_nav_icon"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:text="New Text"
        android:textColor="#000"
        android:textSize="@dimen/regular" />
</RelativeLayout>

please do help me out where i went wrong.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
135 views
Welcome To Ask or Share your Answers For Others

1 Answer

I assume after click on any item you close the drawer and show some screen. When drawer is closed listview resets itself and re-render it when drawer is opened again.

Solution would be to save the selected index and in getView method you set the desired bg color on the item for that index.

  1. Create a class level variable

    public static int NAV_CURR_SELECTION = 2; // you have used 2 in init()
    
  2. Add this

    NAV_CURR_SELECTION = position;
    

    in onItemClick() method

  3. Now, add these lines in onDrawerOpened()

    lvNavItems.setItemChecked(NAV_CURR_SELECTION, true);
    lvNavItems.setSelection(NAV_CURR_SELECTION);
    

Edit: Rather than using the two lines mentioned above in onDrawerOpened() do this. (Only change step 3. 1 and 2 need to remain same)

View v = lvNavItems.getChildAt(NAV_CURR_SELECTION);
v.setBackgroundColor(0xFF00FF00); // or whatever color you need

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...