listView优化问题

关于listView优化问题:阻止列表重复形状的加载,即选项样式的重复加载。加载一次即可,缓存到convertView
其中notes为listView列表集合,note为列表中一个选项对象,有noteInfo、noteTime、isCheck三个属性,note_work_list_item为xml文件为列表每一项对象的样式,样式中有tv_noteInfo、tv_noteTime、cb_noteDel三个控件,对应note三个属性。
/**
* listView适配器
*/

BaseAdapter mBaseAdapter = new BaseAdapter()
{
    // 封装ListView上的每一View控件
    class ViewHold
    {
        public FrameLayout note_work_list_item;
        public TextView tv_noteInfo;
        public TextView tv_noteTime;
        public CheckBox cb_noteDel;
    }
    @Override
    public View getView ( int position, View convertView, ViewGroup parent)
    {
        ViewHold viewHold = null;
        // 第一步:把listView列表的形状在第一次执行getView的时候固定,即缓存到convertView
        // 这里的第一次执行指的是listview中每一项的第一次执行
        if (convertView == null)
        {
            Log.i("lhy", "getView");
            convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.note_work_list_item, null);
            viewHold = new ViewHold();
            viewHold.note_work_list_item = (FrameLayout) convertView.findViewById(R.id.note_work_list_item);
            viewHold.tv_noteInfo = (TextView) convertView.findViewById(R.id.tv_noteInfo);
            viewHold.tv_noteTime = (TextView) convertView.findViewById(R.id.tv_noteTime);
            viewHold.cb_noteDel = (CheckBox) convertView.findViewById(R.id.cb_noteDel);
            convertView.setTag(viewHold);
        }
        else
        {
            viewHold = (ViewHold) convertView.getTag();
        }
     // 第二步:自主设置laistView中每一项的信息内容
    viewHold.tv_noteInfo.setText(notes.get(position).noteInfo);
    viewHold.tv_noteTime.setText(new SimpleDateFormat("yyyy-MM-dd hh:mm ").format(notes.get(position).noteTime));
    viewHold.cb_noteDel.setChecked(notes.get(position).isCheck);
    // 注意,这里要想很好的设置checkBox组件的值必须将其状态保存设置放在了外部,比如作为listView列表选项的属性isCheck,因为如果直接在listView中使用组件CheckBox
    // 并且改变状态在滑屏之后是不能够保存其任何状态的。【ListView的一个特性是ListView中的每一个选项item都不会保存选项上面任何组件的任何状态值】
    // 所以这里必须借助外部添加保存住checkBox组件的状态。所以以下方案在单击checkBox的时候选中并在滑屏后能保存住是不能实现的【ListView选项在删除状态下单击事件即可实现】
    // 将行标设置到checkBox中,以便单击该项,该项的checkbox有反应
    // viewHold.cb_noteDel.setTag(position);
    // 进入删除状态后,单击选项框事件,选中listView选项
    // viewHold.cb_noteDel.setOnClickListener(new OnClickListener()
    // {
    //     @Override
    //     public void onClick ( View v)
    //     {
    //          选中某一项
    //         notes.get(Integer.parseInt(v.getTag().toString())).isCheck =true;
    //     }
    // });
    }
    else
    {
        viewHold.cb_noteDel.setVisibility(View.GONE);
    }
        return convertView;
    }
    @Override
    public long getItemId ( int position)
    {
        // 返回列表集合的下标TODO Auto-generated method stub
        return position;
    }
    @Override
    public Object getItem ( int position)
    {
        // 返回列表集合的的每一项TODO Auto-generated method stub
        return notes.get(position);
    }
    @Override
    public int getCount ()
    {
        // 返回列表集合的大小TODO Auto-generated method stub
        return notes.size();
    }
};
posted on 2013-10-26 16:03  知行立远  阅读(219)  评论(0编辑  收藏  举报