我是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;
}
}
答案 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);
最后,您将返回此视图,其中包含相关数据,然后显示在列表中。
适配器还有很多其他功能,但简而言之,这就是它的工作原理。