安卓开发-Adapter 适配器

Adapter:适配器,因为ListView是一个View,不能添加子项,因此在呈现数据的时候就需要某种工具将数据呈现在ListView上,而Adapter就能充当此角色。

LayoutInflater

     它的作用类似于findViewById(),不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

    具体作用:

   1)、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

   2)、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

获得 LayoutInflater 实例的三种方式

  1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater()
  2. LayoutInflater inflater = LayoutInflater.from(context);
  3. LayoutInflater inflater = (LayoutInflater)context.getSystemService

ViewHolder

要想使用 ListView 就需要编写一个 Adapter 将数据适配到 ListView上,而为了节省资源提高运行效率,一般自定义类 ViewHolder 来减少 findViewById() 的使用以及避免过多地 inflate view,从而实现目标。

Adapter的定义 

1、继承 BaseAdapter (可在继承的时候指定泛型,扩展使用);

2、重写四个基本方法:

getCount():获取数据的总的数量,返回 int 类型的结果;

getItem(int position) :获取指定位置的数据,返回该数据;

getItemId(int position):获取指定位置数据的id,返回该数据的id,一般以数据所在的位置作为它的id;

getView(int position,View convertView,ViewGroup parent):关键方法,用于确定列表项

3、创建 ViewHolder (包含列表项的控件。)

代码展示

public class MyListAdapter extends BaseAdapter // 类定义

// 自定义数据集与布局加载器

List<Note> notes;

LayoutInflater inflater;

/** 构造方法 */

public MyListAdapter(Context context,List<Note> notes){

    this.notes = notes;

    inflater = LayoutInflater.from(context);

}

/** 重写方法 */

@Override

public int getCount(){

    return notes.size();

}

@Override

public Object getItem(int position){

    return notes.get(position);

}

@Override

public long getItemId(int position){

    return position;

}

@Override

public View getView(int position,View convertView,ViewGroup parent){

    ViewHolder viewHolder;

    // 若无可重用的 view 则进行加载

    if(converView == null){

        convertView = inflater.inflate('列表项布局文件',parent,false);

        // 初始化 ViewHolder 方便重用

        viewHolder = new ViewHolder();

        viewHolder.tvTitle = (TextView) convertView.findViewById('id1');

        viewHolder.tvContent = (TextView) convertView.findViewById('id2');

        converView.setTag(viewHolder);

    }else{ // 否则进行重用

        viewHolder = (ViewHolder)convertView.getTag();

    }

    // 获得条目内容对象

    Note note = notes.get(position);

    // 设置内容(Note Bean 需要自定义)

    viewHolder.tvTitle.setText(note.getTitle());

    viewHolder.tvContent.setText(note.getContent());

    return converView;

}

/** 创建 ViewHolder */

class ViewHolder{

    TextView tvTitle;

    TextView tvContent;

}

猜你喜欢

转载自www.cnblogs.com/celiany/p/10073898.html