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();
}
};
* 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();
}
};