Custom adapter for navigation drawer

后端 未结 2 744
别那么骄傲
别那么骄傲 2020-12-18 10:20

I have a working navigation drawer that uses ArrayAdapter as shown in the documentation. I want to set ImageView icons for each of the navigation d

相关标签:
2条回答
  • 2020-12-18 11:02

    Updated
    1) I don't see the source of data to be displayed in your code - you don't pass it in the constructor or any other way
    2) In getView() you should set values for your Views
    3) To be efficient you have to re-use convertView if it's not null
    4) And at last - for your CustomAdapter override also following methods:

        @Override
        public int getViewTypeCount() {
       ...
        }
    
    
        @Override
        public int getItemViewType(int position) {
       ...
        }
    
        @Override
        public int getCount() {
        ...
        }
    
        @Override
        public YOUR_ITEM_TYPE getItem(int position) {
        ...
        }
    
        @Override
        public long getItemId(int position) {
        ...
        }
    
        @Override
        public boolean hasStableIds() {
        ...
        }
    
        @Override
        public boolean isEmpty() {
        ...
        }
    
        @Override
        public boolean areAllItemsEnabled() {
        ...
        }
    
        @Override
        public boolean isEnabled(int position) {
        ...
        }
    
    0 讨论(0)
  • 2020-12-18 11:03

    For your custom adapter:

    public class NavDrawerAdapter extends ArrayAdapter<NavDrawerItem>
    {
        private final Context context;
        private final int layoutResourceId;
        private NavDrawerItem data[] = null;
    
        public NavDrawerAdapter(Context context, int layoutResourceId, NavDrawerItem [] data)
        {
            super(context, layoutResourceId, data);
            this.context = context;
            this.layoutResourceId = layoutResourceId;
            this.data = data;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    
            View v = inflater.inflate(layoutResourceId, parent, false);
    
            ImageView imageView = (ImageView) v.findViewById(R.id.navDrawerImageView);
            TextView textView = (TextView) v.findViewById(R.id.navDrawerTextView);
    
            NavDrawerItem choice = data[position];
    
            imageView.setImageResource(choice.icon);
            textView.setText(choice.name);
    
            return v;
        }
    }
    

    For NavDrawerItem:

    public class NavDrawerItem
    {
        public int icon;
        public String name;
    
        public NavDrawerItem(int icon, String name)
        {
            this.icon = icon;
            this.name = name;
        }
    }
    

    For drawer_list_item.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:background="?android:attr/activatedBackgroundIndicator"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:padding ="10dp">
    
        <ImageView
            android:id="@+id/navDrawerImageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:paddingRight="10dp"/>
    
        <TextView
           android:id="@+id/navDrawerTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/navDrawerImageView"
            android:paddingRight="10dp"
            android:textAppearance="?android:attr/textAppearanceListItemSmall"/>
    
    </RelativeLayout>
    

    In MainActivity.java, instantiate an array of NavDrawerItem objects, with the appropriate drawable and name for each, and then pass this array when you set the adapter, like so:

    mDrawerList.setAdapter(new YourAdapter(this, R.layout.drawer_list_item, yourArray));

    0 讨论(0)
提交回复
热议问题