BaseAdpter自由度很高,能实现很多需求,十分值得学习.
这是listview的Item的布局
实现BaseAdpter首先得创建继承BaseAdpter类
public class MyAdapter extends BaseAdapter{
private List<ItemContent> list;
private LayoutInflater inflater;
private Context context;
ItemContent content; //item封装对象
@Override
public int getCount() {
// TODO 自动生成的方法存根
return 0; //return list.size();得到list长度
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return null; // <span style="white-space:pre"> </span>return list.get(position);得到list指定position位置item
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return 0; //return position; 得到当前item位置
}
@Override
public View getView(int position, View convertView, ViewGroup parent) { //返回控件
// TODO 自动生成的方法存根
return null;
}
<strong>getView 耗时写法</strong>
<strong></strong><pre name="code" class="java">public View getView(int position, View convertView, ViewGroup parent) {
// TODO 自动生成的方法存根
content = list.get(position); //得到当前item封装类对象
View view =inflater.inflate(R.layout.listitem, null); //加载布局
ImageView imageView=(ImageView) view.findViewById(R.id.imageView1);
TextView tv= (TextView) view.findViewById(R.id.textView1);
Button button=(Button) view.findViewById(R.id.button);
imageView.setImageResource(content.image);
tv.setText(content.text);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
Toast.makeText(context, "click", 0).show();
}
});
return view;
}
上述这样写代码虽然简短,但每个item都得重新加载布局和findviewbyid,对手机负担较大十分影响性能。
所以推荐用下面这种优化方式 添加ViewHolder内部类find控件和判断convertView 是否已被加载,这样所以的初始化只有进行一次就够了,对性能的优化显著提升
public View getView(int position, View convertView, ViewGroup parent) {
// TODO 自动生成的方法存根
content = list.get(position); //得到当前item封装类对象
ViewHolder viewHolder;
if (convertView == null) { //只有null时才会加载布局
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.listitem, null);
// 缓存 ,不重复创建
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
viewHolder.button=(Button) convertView.findViewById(R.id.button);
convertView.setTag(viewHolder);//设置标签}else
{viewHolder=(ViewHolder) convertView.getTag();
viewHolder.imageView.setImageResource(content.image);
viewHolder.tv.setText(content.text);
viewHolder.button.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v) {// TODO 自动生成的方法存根
Toast.makeText(context, "click", 0).show();}});
return convertView;}
class ViewHolder { // 防止findviewbyid重复使用
ImageView imageView;
TextView tv;
Button button;
}