导航抽屉定制适配器

时间:2014-11-22 21:27:29

标签: android android-arrayadapter navigation-drawer custom-adapter

我有一个使用ArrayAdapter的工作导航抽屉,如documentation所示。我想为每个导航抽屉项目设置ImageView图标,所以我需要创建一个自定义适配器来使用,但我不确定如何做到这一点。我在下面运行而不会崩溃应用程序,但导航抽屉打开空,没有任何内容。你能帮帮我吗?提前谢谢!

到目前为止,我为自定义适配器做了些什么:

public class CustomAdapter extends ArrayAdapter
{
    private final Context context;

    public CustomAdapter(Context context)
    {
       super(context, R.layout.drawer_list_item);
       this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v = inflater.inflate(R.layout.drawer_list_item, parent, false);
        TextView textViewHome = (TextView) v.findViewById(R.id.drawerHomeTextView);
        ImageView imageViewHome = (ImageView) v.findViewById(R.id.drawerHomeImage);
        TextView textViewList = (TextView) v.findViewById(R.id.drawerListTextView);
        ImageView imageViewList = (ImageView) v.findViewById(R.id.drawerListImage);

        return v;
    }
}

MainActivity中设置抽屉:

mDrawerList = (ListView) findViewById(R.id.leftDrawer);

mDrawerList.setAdapter(new CustomAdapter(this));

使用了ListView

<ListView android:id="@+id/leftDrawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="left"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#111"/>

drawer_list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">

    <RelativeLayout
        android:id="@+id/drawerRelativeLayoutHome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/drawerHomeImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:paddingStart="4dp"
            android:paddingEnd="4dp"
            android:paddingLeft="4dp"
            android:src="@drawable/ic_menu_home"/>

        <TextView
            android:id="@+id/drawerHomeTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/drawerHomeImage"
            android:layout_toEndOf="@+id/drawerHomeImage"
            android:background="@drawable/background_activated"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:paddingTop="12dp"
            android:paddingBottom="12dp"
            android:text="Home"
            android:textSize="20sp"/>
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/drawerRelativeLayoutList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/drawerRelativeLayoutHome">

        <!-- same as above, but ic_menu_archive as drawable, and "List" as text -->

    </RelativeLayout>

</RelativeLayout>

2 个答案:

答案 0 :(得分:7)

对于您的自定义适配器:

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

NavDrawerItem

public class NavDrawerItem
{
    public int icon;
    public String name;

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

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>

MainActivity.java中,实例化一个NavDrawerItem个对象数组,每个对象都有相应的drawable和名称,然后在设置适配器时传递此数组,如下所示:

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

答案 1 :(得分:0)

<强>更新
1)我没有看到要在您的代码中显示的数据来源 - 您不能在构造函数中或任何其他方式传递它 2)在getView()中,您应为观看次数设置值 3)为了提高效率,如果不是convertView,则必须重新使用null 4)最后 - 对于你的CustomAdapter覆盖也遵循以下方法:

    @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) {
    ...
    }