在我们 的自定义ListView的实现中,重写getView方法时,可以实现convertView的优化,使ListView的Item实现复用,大大减少了ListView加载iten的效率;以下是一个Demo
getView的复用步骤为:
1,判断convertView是否为空,为空则是表示第一次加载Item,则通过布局映射器LayoutInflater来加载我们的自定义布局;
2、判断为false则进行复用,我们定义一个ViewHolder,在ViewHolder类中声明我们定义的Item显示布局的控件即可,我们就是设置textView即可
3、对第一步中进行ViewHolder进行实例化,然后初始化ViewHolder中声明的TextView控件,并给convertView打标签来绑定ViewHolder;
4、对ViewHolder实例化对象中的TextView 控件进行设置数据源
5、返回convertView对象
具体代码
public class MainActivity extends AppCompatActivity { private ArrayList<String> list; private MyAdapter adapter; private ViewHolder holder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.lv); list = new ArrayList(); for (int i=0;i<=40;i++){ list.add("数据"+i); } adapter = new MyAdapter(); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override //设置点击事件的参数 parent属性指的是AdapterView的对象,即为listView,position是数据的索引,id则是数据所在ListView的行号 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "你点击了索引是:"+position+"行Id:"+id, Toast.LENGTH_SHORT).show(); } }); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { //获取布局LayoutInflate布局映射器 LayoutInflater inflater = LayoutInflater.from(MainActivity.this); convertView = inflater.inflate(R.layout.myadapter, null); holder = new ViewHolder(); holder.tv = (TextView) convertView.findViewById(R.id.textView); //打标签 将holder绑定给convertView convertView.setTag(holder); Log.d("TAG", "getView:方法创建" + convertView); } else {//进行复用 holder = (ViewHolder) convertView.getTag(); Log.d("TAG", "getView:方法复用" + convertView); } holder.tv.setText(list.get(position)); return convertView; } } class ViewHolder{ //把布局文件需要用到的控件进行声明 TextView tv; } }