自己定义适配器优化

自己定义适配器优化

简单原理

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;
}
原文地址:https://www.cnblogs.com/ganwei/p/4774335.html