Xiao bailong

自己定义适配器优化

自己定义适配器优化

简单原理

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;
    }
posted @   小白龙on  阅读(501)  评论(0编辑  收藏  举报
努力加载评论中...

QQ:846650266,电话:15117424475

© 白龙工作室 |隐私条款 |服务条款 |盘ICP备10000000号-1

点击右上角即可分享
微信分享提示