标签:
简单原理
ListView.setAdapter(adapter);
该方法用来设置listView
的适配器,ListView
通过我们自己定义的适配器中geiView()
方法获取到每次装载的布局和数据文件。我们在设置每次展示的布局就是在getView()
方法中设置的。由于每次加载布局都会通过LayoutInflater
类来装载一次布局,如果我们的列表太多的话就会有产生很多View
所以我们主要的就是优化我们的View
对象在内存当中的产生数量。
实现思路
用一个盒子来装载每次我们创建View
当我们下次需要的时候我们就直接获取就可以了。具体代码如下
public class DiaryListAdapter extends BaseAdapter
{
private Context context;
private List<Map<String, Object>> data;
/*
* context:上下文
* data: 转载的数据源
*/
public DiaryListAdapter(Context context, List<Map<String, Object>> data)
{
// TODO Auto-generated constructor stub
this.context = context;
this.data = data;
}
public void setData(List<Map<String, Object>> data)
{
this.data = data;
}
//获取所有装载数据的数量
@Override
public int getCount()
{
// TODO Auto-generated method stub
return data == null ? 0 : data.size();
}
//获取指定位置的对象
@Override
public Object getItem(int position)
{
return data == null ? null : data.get(position);
}
//获取对象的Id
@Override
public long getItemId(int position)
{
return data == null ? 0 : Long.valueOf(data.get(position).get("_id").toString());
}
// 自己定义适配器
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Map<String, Object> map = data.get(position);
// 创建一个盒子
myLoyout loyout = null;
if (convertView == null)
{
convertView = LayoutInflater.from(context).inflate(R.layout.note_item, parent, false);
//把布局保存起来。
loyout = new myLoyout();
loyout.contentTv = (TextView) convertView.findViewById(R.id.content_tv);
loyout.titleTv = (TextView) convertView.findViewById(R.id.title_tv);
//布局保存起来。避免二次加载在去FindViewId去寻找一次控件
convertView.setTag(loyout);
} else
{
//如果可以回收的的布局不为空
loyout = (myLoyout) convertView.getTag();
}
loyout.contentTv .setText(map.get("title").toString());
loyout.titleTv.setText(map.get("content").toString());
return convertView;
}
// 定义一个包装适配器
private class myLoyout
{
public TextView titleTv;
public TextView contentTv;
}
标签:
原文地址:http://www.cnblogs.com/ganwei/p/4774335.html