近期很多class="t_tag">Android开发者来函表示对ArrayAdapter和BaseAdapter的区别不是很清楚,这里Android123简单说下他们的关系和用处,ArrayAdapter是从BaseAdapter派生出来的,具备BaseAdapter的所有功能,但ArrayAdapter更为强大,它实例化时可以直接使用泛型构造,我们在Android SDK中可以看到android.widget.ArrayAdapter<T>的字样,当然也可以使用 ArrayAdapter(Context context, int textViewResourceId) 第二个参数直接绑定一个layout,下文的例子我们使用Java泛型实例化。
通过Adapter我们构造一个支持icon的item,下面我们在getView中使用的是imageView显示图片,当然android123提示大家其实TextView也可以直接绑定一个drawable对象显示的,void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) 或void setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) 和void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) 即可,其中第二种的int类型指定的资源id,方位则是textview什么位置显示drawable对象
说了这么多ArrayAdapater一起看个例子,来实例化ArrayAdapter吧,我们可以修改Res/layout/icon_list_item.xml文件来实现自定义显示效果。
Java代码
- public class IconListAdapter extends ArrayAdapter<IconListAdapter.IconListItem> {
- protected LayoutInflater mInflater;
- private static final int mResource = R.layout.icon_list_item;
-
- public IconListAdapter(Context context,
- List<IconListItem> items) {
- super(context, mResource, items);
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView text;
- ImageView image;
-
- View view;
- if (convertView == null) {
- view = mInflater.inflate(mResource, parent, false);
- } else {
- view = convertView;
- }
-
- text = (TextView) view.findViewById(R.id.text1);
- text.setText(getItem(position).getTitle());
-
- image = (ImageView) view.findViewById(R.id.icon);
- image.setImageResource(getItem(position).getResource());
-
- return view;
- }
-
- public static class IconListItem {
- private final String mTitle;
- private final int mResource;
-
- public IconListItem(String title, int resource) {
- mResource = resource;
- mTitle = title;
- }
-
- public String getTitle() {
- return mTitle;
- }
-
- public int getResource() {
- return mResource;
- }
- }
- }
当然对于ArrayAdapter到底比BaseAdapter先进到哪里呢? 从名称来看Array我们可以联系到数组的很多操作,没错Android123给大家列出本类所有成员方法实用的处理方式,比如:
Java代码
- void add(T object)
-
- void clear()
-
- static ArrayAdapter<CharSequence> createFromResource(Context context, int textArrayResId, int textViewResId)
-
- Context getContext()
-
- int getCount()
-
- View getDropDownView(int position, View convertView, ViewGroup parent)
-
- Filter getFilter()
-
- T getItem(int position)
-
- long getItemId(int position)
-
- int getPosition(T item)
-
- View getView(int position, View convertView, ViewGroup parent)
-
- void insert(T object, int index)
-
- void notifyDataSetChanged()
-
- void remove(T object)
-
- void setDropDownViewResource(int resource)
- Sets the layout resource to create the drop down views.
-
- void setNotifyOnChange(boolean notifyOnChange)
- (add(T), insert(T, int), remove(T), clear() 的操作,当然可以通过 notifyDataSetChanged(). 或 setNotifyOnChange(true) 通知变化
-
- void sort(Comparator<? super T> comparator)
所以最终android123推荐大家什么情况使用arrayadapter,什么时候使用baseadapter。当数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui,通过setNotifyOnChanage方法,如果比较简单仅仅呈现直接从 baseadapter更节省资源。