ArrayAdapter在构建导航抽屉时的目的是什么?

时间:2014-07-15 15:17:42

标签: java android navigation-drawer

我是Android开发人员的新手,我正在根据以下教程开发导航抽屉:Android Custom Navigation Drawer

在该教程中,他创建了一个从ArrayAdapter扩展的CustomDrawerAdapter类

我的问题是: 什么是ArrayAdapter?

这里使用的ArrayAdapter / CustomDrawerAdapter是什么? (用于导航抽屉)

更具体地说,ArrayAdapter / CustomDrawerAdapter的getView方法有什么作用?

PS。我已经阅读了android参考资料,但它并没有多大帮助。 特别是,getView方法甚至没有描述。

CustomDrawerAdapter的代码

package com.example.tabapp;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {

      Context context;
      List<DrawerItem> drawerItemList;
      int layoutResID;

      public CustomDrawerAdapter(Context context, int layoutResourceID,
                  List<DrawerItem> listItems) {
            super(context, layoutResourceID, listItems);
            this.context = context;
            this.drawerItemList = listItems;
            this.layoutResID = layoutResourceID;

      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            DrawerItemHolder drawerHolder;
            View view = convertView;

            if (view == null) {
                  LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                  drawerHolder = new DrawerItemHolder();

                  view = inflater.inflate(layoutResID, parent, false);
                  drawerHolder.ItemName = (TextView) view
                              .findViewById(R.id.drawer_itemName);
                  drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);

                  view.setTag(drawerHolder);

            } else {
                  drawerHolder = (DrawerItemHolder) view.getTag();

            }

            DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);

            drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID()));
            drawerHolder.ItemName.setText(dItem.getItemName());

            return view;
      }

      private static class DrawerItemHolder {
            TextView ItemName;
            ImageView icon;
      }
}

1 个答案:

答案 0 :(得分:1)

假设您有ListView listView,则会使用适配器为此listView设置数据源:listView.setAdapter(customAdapter)

listView可以有多个列表项,然后由适配器提供。通常,在初始化适配器时,会将一些数据源传递给适配器。然后,适配器使用来自此数据源的数据为listView生成视图,这一代视图在getView()方法内完成。

因此,如果适配器想要知道第一个列表项的外观,它将调用位置为0的getView()。现在你的getView()方法应该处理第0个视图的样子。

我们通常做的是将相关数据存储在Arraylist中,然后从该arraylist中获取第0个对象以生成视图。

在抽屉的情况下,请看这一行: DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);

这是从drawerItemList获取位置的相关对象,然后将其设置为视图:

drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID()));
drawerHolder.ItemName.setText(dItem.getItemName());

这些视图会夸大您希望特定视图具有的布局:

view = inflater.inflate(layoutResID, parent, false);

最后,您将返回此视图,其中包含相关数据,然后显示在列表中。

适配器还有很多其他功能,但简而言之,这就是它的工作原理。