ListAdapter属于接口, 一般情况并不直接使用, 因为没必要重写全部方法. 一般使用其子类.
// 是否启用item. 如果fasle则不启用. item处于无法选择和点击的状态
boolean isEnabled(int position);
// 可以看到没有position参数. 所以如果返回fasle则全部item都处于不启用状态
public boolean areAllItemsEnabled();
继承父类的方法
int getCount () // 决定ListView的Item数量
Object getItem (int position) // 得到item 数据. 这里返回的值会在ListView中使用到
long getItemId (int position) // 得到item 的 id. 这里返回的值会在ListView中使用到
// 返回Item类型, 类型是否相同决定是否复用item
int getItemViewType (int position)
// 返回Item视图内容
View getView (int position, // 位置
View convertView, // 复用视图
ViewGroup parent) // 父容器
// 返回Item类型数量
int getViewTypeCount ()
// id是否唯一
boolean hasStableIds ()
boolean isEmpty () // 是否为空
void registerDataSetObserver (DataSetObserver observer) // 注册数据观察者
void unregisterDataSetObserver (DataSetObserver observer) // 取消数据观察者
是否唯一
hasStableIds()
这个方法是判断id是否是有效. 返回true有效false无效.
- 有效的情况下会通过
getItemId()
的返回id值来判断item是否是相同 - 无效的情况下会默认使用item的position来当作id
BaseAdapter
首先我讲讲最常用适配器 BaseAdapter.
特点:
-
ListView支持高度自定义的Item
-
需要自己重写该适配器来使用
重写方法
final String[] title = {“用户”, “首页”, “设置”, “关于”, “反馈”};
// 这是写了个匿名类
mListView.setAdapter(new BaseAdapter() {
/**
- 控制ListView的Item的数量
- @return
*/
@Override
public int getCount() {
return title.length;
}
/**
- 控制ListView的某些方法返回的Object数据.
- 例如ListView的getItemAtPosition()方法. 通过位置索引得到数据对象, 即该方法返回的Object对象
- @param position
- @return
*/
@Override
public Object getItem(int position) {
return null;
}
/**
- 每次点击item都会回调该方法. 同样是为了ListView的getItemIdAtPosition()方法能够得到item的id
- @param position
- @return
*/
@Override
public long getItemId(int position) {
return 0;
}
/**
- 控制ListView的Item的视图显示
- @param position 当前显示的视图位置
- @param convertView 缓存的视图. 用于复用item
- @param parent 父容器布局
- @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(MainActivity.this, R.layout.item_list, null);
// 根据传入的数据进行修改
TextView text = ButterKnife.findById(view, R.id.text);
text.setText(title[position]);
return view;
}
});
在主布局中添加控件
注意inflate item 视图的时候是否启用parent.
后面的布局文件我不会再写出来了. 多余代码影响阅读性.
介绍下BaseAdapter相对于父类ListAdapter增加的方法. 这些方法都不是必须的
// 判断适配器是否存在item
boolean isEmpty ()
// DropDownView等方法是重写的SpinnerAdapter的. 所以会在讲解Spinner的时候详细讲. ListView和GridView用不到
View getDropDownView (int position,
View convertView,
ViewGroup parent)
boolean hasStableIds ()
void notifyDataSetChanged () // 数据如果发生变化通知ListView局部更新
void notifyDataSetInvalidated () //数据如果发生变化通知ListView整个更新
ArrayAdapter
ArrayAdapter是BaseAdapter的子类, 进行了进一步的封装, 能够快速实现最简单的字符串列表(同时限制了数据只能是单一的字符串). 注意这不是抽象类. 可以直接创建对象.
特点:
- 只需要构造方法就可以构造出一个ListView出来
- 自定义很弱, ListView的数据只能是字符串.
创建ArrayAdapter的时候需要指定泛型ArrayAdapter<T>
. 泛型决定了构造方法能接受的数据类型
构造方法
ArrayAdapter (Context context, // 上下文
int resource) // 布局id. 只支持根布局是TextView的布局
ArrayAdapter (Context context,
int resource, // 这个构造方法就支持任意布局了
int textViewResourceId) // 指定一个Textview的id来设置数据.
ArrayAdapter (Context context,
int resource,
T[] objects) // 直接在构造方法添加数据, 必须是字符串的数组
ArrayAdapter (Context context,
int resource,
int textViewResourceId,
T[] objects) // 同上
ArrayAdapter (Context context,
int resource,
List objects)// 添加数据集合, 同样必须是字符串
ArrayAdapter (Context context,
int resource,
int textViewResourceId, // 同上
List objects) // 添加数据集合
示例
String[] array = {“用户”, “首页”, “设置”, “关于”, “反馈”};
// 这里的android.R.layout.simple_list_item_1是系统提供的TextView布局文件推荐直接拿来用. 可以点开看下源码.
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_l