Adapter之ListView的复用
- 作用:优化空间节省使用内存
1.初始化数据
不管是那种复用都需要用到Adapter这个类,所以我们先新建一个类(MyAdapter)去继承Adapter同事重写Adapter的四个方法.
代码如下↓
1 新建MyAdapter类
public class MyAdapter extends BaseAdapter {
//返回item的数量
@Override
public int getCount() {
return 0;
}
//返回第 i 个item
@Override
public Object getItem(int i) {
return null;
}
//有多少个item
@Override
public long getItemId(int i) {
return 0;
}
//加载布局.
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
return null;
}
}
2.初始化数据
- 我们知道Adapter不管是不是做复用,都需要有数据,那么我们下一步就传入所需要的数据;
//初始化上下文(构造方法传入)
private Context context;
//初始化一个集合,作用是装数据(构造方法传入)
private List<MyData> myDataList;
//初始化实体类
private MyData MyData = new MyData();
//初始化布局管理器
private LayoutInflater inflater;
public ListViewAdapter(Context context, List<MyData> myDataList) {
// Context 和 List 通过构造方法传入
this.context = context;
this.myDataList = myDataList;
//通过上下文去获得系统的布局管理器
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
3.初始化实体类.
public class MyData {
private String title ;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
-
这里的实体类只有一个title 根据自己的需求添加, 并生成getSet方法.
4.在getView()方法中向item中设载入布局
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
//1.复用的第一步,先判断view是为空,如果是空的,就加载布局,填入内容
if (view == null) {
//3.创建完ViewHolder后初始化ViewHolder
viewHolder = new ViewHolder();
//2.如果view是空的,直接填入内容,item完成后就可以创建ViewHolder了.
view = inflater.inflate(R.layout.my_item, null);
//4.将item中的view传递给ViewHolder
viewHolder.tv_title = view.findViewById(R.id.title_item);
//5.设置Tag(); 相当于给每一个item条目做标记,放入容器中 下次拿出来直接用
view.setTag(viewHolder);
} else {
//6.这个时候ViewHolder都是有值的了,就把刚才用过的item那出来复用.
viewHolder = (ViewHolder) view.getTag();
}
//7.取出每个条目
myData = myDataList.get(i);
//8.设置复用后的值
viewHolder.tv_title.setText(myData.getTitle());
return view;
}
5.创建ViewHolder
class ViewHolder {
//初始化view
TextView tv_title;
}
6.在MainActivity中使用
//创建Adapter
MyAdapter adapter = new MyAdapter(this,myDataList);
//在ListView控件上设置adapter
mListView.setAdapter(adapter);
-
结语:本文如果有错请指正!