4

我有一個工作導航抽屜,使用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> 

回答

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