Day十二天ListView、BaseAdapter

本文详细介绍了Android中的ListView组件,包括其概念、职责、显示原理及优化技巧,并深入探讨了BaseAdapter的使用方法。
一、ListView介绍:
(一)、 ListView 概念:
ListView是Android中最重要的组件之一,几乎每个Android应用中都会使用ListView。它以垂直列表的方式列出所需的列表项。
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AdapterView
↳ android.widget.AbsListView
↳ android.widget.ListView
(二)、ListView的两个职责:
①.在页面显示数据;
②.处理用户的点击等操作。
(三)、列表的显示需要三个元素(Model,View,Controler):
  1. ListView:用来展示列表的View;[V]View
  2. 适配器: 用来把数据映射到ListView上的中介;[C]Controler
  3. 数据源(Data): 具体的将被映射的字符串,图片等。[M]Mode
(四)、什么是适配器?
  适配器是一个将数据(Data) 填充到 AdapterView(ListView就是一个典型的AdapterView)的中介,通过它能实现数据  与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。将数据源的数据适配到ListView中  的常用适配器有:ArrayAdapter、SimpleAdapter 和 SimpleCursorAdapter。
ArrayAdapter最为简单,只能展示一行文本;
SimpleAdapter有最好的扩充性,可以自定义各种各样的布局,除了文本外,还可以放ImageView(图片)、Button(按钮)、CheckBox(复选框)等组件;
(五)、ListView的常用UI属性:

android:divider 分割线(颜色/图片)

android:dividerHeight 分割线高度

android:entries="@array/myarr" 指定一个字符串数组


二、BaseAdapter介绍
 adapter是view和数据的桥梁。在一个ListView或者GridView中,你不可能手动给每一个格子都新建一个view,所以这时候就需要Adapter的帮忙,它会帮你自动绘制view并且填充数据
BaseAdapter是ArrayAdapter和SimpleAdapter的父类
抽象类
1.基本使用:必须重写的四个方法

public class MyAdapter  extends BaseAdapter {
     
    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return null;
    }
}

@Override
public int getCount() {
    return games.size();
}

@Override
public Object getItem(int position) {
    return games.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

  • getCount() :获取条目数量
  • getItem(int position): 获取pposition位置条目的对象
  • getItemId(int position):  获取position位置条目的id
  • getView(int position,View convertView, ViewGroup parent):  获取position位置条目的视图,重写方法中最重要的方法 
2.LayoutInflater布局加载器:
//第一步  要将  res/layout/布局文件  item_layout.xml转换成为一个View对象 才能够作为返回值返回
//LayoutInflater 布局加载器! 作用: 将布局文件转换成为Java的View对象
//实例化布局加载器的方法: 参数  上下文对象
LayoutInflater inflater = LayoutInflater.from(context);
/*使用 布局加载器进行对象转化
参数一 表示的 是 布局对象的id
参数二 表示的是  父布局
参数三 表示的是 是否获取父布局的属性值  false
*/
View view = inflater.inflate(R.layout.item_layout, parent, false);
//获取这个条目应该显示的数据
//获取条目布局中展示 游戏名字的视图
TextView nameTV = (TextView) view.findViewById(R.id.gameName_tv);

3、ListView优化:

/**
 * ListView优化:
 *
 * 1.ListView的高度必须是固定值!  match_parent 或者 多少dp
 * 2.使用convertView 重用视图
 * 3.使用ViewHolder视图持有者减少findvIewById的过程
 * 4.避免滑动的时候加载图片
 * 5.减少在getView方法中做耗时操作逻辑复杂的操作
 *
 *
@param position
 
* @param convertView
 
* @param parent
 
* @return
 
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
   
//1.创建视图持有者引用
    ViewHolder holder = null;
   
//2.判断可重用的视图是否是空的
    if (convertView == null) {
       
//是空的则去初始化条目布局
        convertView =  mInflater.inflate(R.layout.item_layout,parent,false);
      
//创建 视图是持有者对象
        holder = new ViewHolder();
       
//给视图持有者对象里面的 视图赋值
        holder.subjectTv = (TextView) convertView.findViewById(R.id.subject_tv);
       
holder.summaryTv = (TextView) convertView.findViewById(R.id.summary_tv);
       
//将 条目布局视图和 视图持有者关联起来
        convertView.setTag(holder);
   
} else {
       
//如果条目视图不是空的 则直接获取 其视图持有者对象
        holder = (ViewHolder) convertView.getTag();
   
}

   
NewsEntity.ParamzBean.FeedsBean.DataBean data = list.get(position).getData();
   
//视图绑定数据
    holder.subjectTv.setText(data.getSubject());
   
holder.summaryTv.setText(data.getSummary());

   
return convertView;
}

//内部类 视图持有者  推荐使用 static修饰   内部类持有外部引用  /
static class ViewHolder {
    TextView
subjectTv;
   
TextView summaryTv;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值