1.最普通的一种优化,创建一个适配器类使用getView()方法,声明一个View对象,用inflate一个view出来,通过findViewById()得到TextView,重复使用view对象和findViewById()的方法。
private class MyAdapter extends BaseAdapter { @Override public int getCount() { return list_infor.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { View view; view = View.inflate(MainActivity.this, R.layout.activity_item, null); TextView tv_item1=(TextView)view.findViewById(R.id.t1); TextView tv_item2=(TextView)view.findViewById(R.id.t2); TextView tv_item3=(TextView)view.findViewById(R.id.t3); tv_item1.setText(String.valueOf(list_infor.get(i).getId())); tv_item2.setText(list_infor.get(i).getName()); tv_item3.setText(list_infor.get(i).getNumber()); return view; } }
2.优化二
上面的写法没有实现重复使用View对象和findViewById()的方法,此次优化后,只保留能够显示的最大个数的View对象的个数,新的view通过复用的方式使用消失的条目,使用getView()方法中提供的convertView复用view,当convertView==null时,通过inflate一个view出来。
private class MyAdapter extends BaseAdapter { @Override public int getCount() { return list_infor.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { View view; if(convertView==null) { view = View.inflate(MainActivity.this, R.layout.activity_item, null); }else{ view=convertView; } TextView tv_item1=(TextView)view.findViewById(R.id.t1); TextView tv_item2=(TextView)view.findViewById(R.id.t2); TextView tv_item3=(TextView)view.findViewById(R.id.t3); tv_item1.setText(String.valueOf(list_infor.get(i).getId())); tv_item2.setText(list_infor.get(i).getName()); tv_item3.setText(list_infor.get(i).getNumber()); return view; } }
3.优化三
通过上面的写法实现重复使用View对象,但没有解决view组件中的TextView,每次使用都要去xml文件中查找id的问题,此次优化后,可以实现让View中所包含的组件随着view的使用而使用。要创建一个静态内部类,类中的成员变量应与view中所包含的组件的类型个数相同。
private static class ViewHolder{ private TextView tvHolder; private TextView tvHolder1; private TextView tvHolder2; }
private class MyAdapter extends BaseAdapter { @Override public int getCount() { return list_infor.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { tv_item3.setText(list_infor.get(i).getNumber()); View view; ViewHolder holder; if(convertView==null) { view = View.inflate(MainActivity.this, R.layout.activity_item, null); holder=new ViewHolder(); holder.tvHolder=(TextView)view.findViewById(R.id.t1); holder.tvHolder1=(TextView)view.findViewById(R.id.t2); holder.tvHolder2=(TextView)view.findViewById(R.id.t3); view.setTag(holder); }else{ view=convertView; holder=(ViewHolder)view.getTag(); } holder.tvHolder.setText(String.valueOf(list_infor.get(i).getId())); holder.tvHolder1.setText(list_infor.get(i).getName()); holder.tvHolder2.setText(list_infor.get(i).getNumber()); return view; } }
注意:
1.根据保存在业务Bean中的属性,来确定View中组件TextView的个数。
2.使用此方法要新建一个布局文件,根据需要设计布局文件。