Android列表控件

本文详细介绍了Android中常用的列表控件,包括BaseAdapter、ArrayAdapter、SimpleAdapter、WrapperListAdapter和HeaderViewListAdapter,涵盖它们的特点、使用方法、点击事件、多条目处理、内存优化以及选择模式。特别讨论了ListView和GridView的差异,如列宽和间距设置、拉伸模式、选择模式,并提供了内存复用和ViewHolder的优化策略。此外,还提到了ExpandableListView及其相关属性和适配器。
摘要由CSDN通过智能技术生成

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

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值