- Adapter是ListView与数据之间的桥梁
- ListView在开始绘制的时候,系统首先调用getCount(),根据其返回值得到LiatView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView
的每一项
- 当ListView的每一项将要显示时,都会调用Adapter的getView()方法返回一个View。
- ListView中有多少项,就调用多少次getView()方法去创建每一项的View,这一过程是耗时操作。
【注】
1.如果一个屏幕中可以呈现n项item,那么创建view视图的时候,系统会创建n+1个(因为当第一项item还未划出屏幕时,第n+1项item已经划入屏幕)
2.在每次item进行view呈现的时候,因为屏幕中可以显示的item的个数是有限的,所以只要有一个item滑出屏幕,那么必然有一个item滑入屏幕,我们只需要将滑入屏幕的item呈现的view复用之前滑出的item对应的view即可。
3.复用ViewHolder类。在类中定义item中需要复用的控件。然后在convertView创建的时候对应的创建viewHolder对象,然后给定标签进行关联。下一次滑入的item只需要取出这个标签进行控件的重新赋值即可。
4.其实打的这个标签就是为了方便取出在convertView中需要重新赋值的控件。
- 示例代码:
package com.example.myadaptertest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView lv;
private List<String> list;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
lv = findViewById(R.id.lv);
//数据源初始化
list = new ArrayList<String>();
for(int i=0;i<40;i++){
list.add("数据源"+i);
}
//初始化适配器
adapter = new MyAdapter();
lv.setAdapter(adapter);
}
//实现自己的适配器
class MyAdapter extends BaseAdapter{
//计算需要适配的item的总数
@Override
public int getCount() {
return list.size();
}
//获取每一个item对象
@Override
public String getItem(int position) {
return list.get(position);
}
//获取每一个item对象的id
@Override
public long getItemId(int position) {
return position;
}
//获取每一个item对应的View视图——重要
//convertView:系统复用的视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
//表示系统第一次运行
if(convertView == null){
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.my_adapter_item,null);
holder = new Holder();
holder.tv = convertView.findViewById(R.id.myadapter_tv);
//打标签
convertView.setTag(holder);
}else{
// 进行复用
holder = (Holder) convertView.getTag();
}
//赋值
holder.tv.setText(list.get(position));
// //获取布局映射器的对象
// LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// //1.将定义好的xml文件转化成View对象
// View view = inflater.inflate(R.layout.my_adapter_item,null);
// //2.给View对象中的控件进行赋值
// TextView tv = view.findViewById(R.id.myadapter_tv);
// //赋值
// tv.setText(getItem(position));
// //或者 tv.setText(list.get(position));
return convertView;
}
}
class Holder{
private TextView tv;
}
}
网友评论