ListView小常识

一、一般我们继承Adapter后 我们都是这么重写getItemId的

@Override
public long getItemId(int position){
	return position;
}

如果listview 只是展示没有问题,如果有删除item的话最好f返回该数据的ID

@Override
public long getItemId(int position){
	return items.get(position).getId())(;
}

二、有时我们会发现我们修改了item布局的高度却没有生效,是因为getView方法中加载布局的方式问题
使用该加载方式即可

View view = layoutInflater.inflate(R.layout.text_item,parent,false);

三、listview有不同的item需要复写两个方法

int ViewTypeCount = 2;
private interface ViewType{
	int TEXT = 0;
	int IMAGE = 1;

}

@Override
public View getView(int position, View convertView, ViewGroup parent){
	LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
	if(getItemViewType(position) == ViewType.text){
		View view = layoutInflater.inflate(R.layout.text_message_item,parent,false);
		...
		return view;
	}else{
		View view = layoutInflater.inflate(R.layout.img_message_item,parent,false);
		...
		return view;
	}

}

@Override
public int getItemViewType(int position){
	if(getItem(position) instanceof TextMessage){
		return ViewType.TEXT;
	}else{
		return ViewType.IMAGE;
	}
}

@Override
public int getViewTypeCount(){
	return ViewTypeCount
}

四、listview 复用机制
ListView的RecycleBin的缓存机制如下图
ListView小常识

int ViewTypeCount = 2;
private interface ViewType{
	int TEXT = 0;
	int IMAGE = 1;

}

@Override
public View getView(int position, View convertView, ViewGroup parent){
	LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
	if(getItemViewType(position) == ViewType.text){
		//复用
		if(convertView == null){
			convertView = layoutInflater.inflate(R.layout.text_message_item,parent,false);
		}
		
		...
		return convertView;
	}else{
		if(convertView == null){
			convertView = layoutInflater.inflate(R.layout.img_message_item,parent,false);
		}
		...
		return convertView;
	}

}

......


五、ViewHold机制 报存findviewbyid,来优化时间

@Override
public View getView(int position, View convertView, ViewGroup parent){
	ViewHolder viewHolder;
	if(convertView == null){
		convertView = layoutInflater.inflate(R.layout.text_message_item,parent,false);
		TextView time = convertView.findviewById(R.id.time);
		TextView name = convertView.findviewById(R.id.name);
		viewHolder = new ViewHolder(time ,name);
		convertView.setTag(viewHolder);
	}else{
		viewHolder = (ViewHolder)convertView.getTag()
	}
	viewHolder.getTime.settext(...)
	viewHolder.getName.settext(...)

private static class ViewHolder {
	

	private TextView time;
	private TextView name;
	public View Holder(Textview time, TextView name){
		this.time = time;
		this.name = name
	}
	public TextView getTime(){
		return time;
	}
	public TextView getName(){
		return name;
	}
}

六、Listview的刷新
1、修改数据源
2、notifyDataSetChanged

七、局部刷新
如果修改的数据源不需要显示在当前listview显示的几个item上就不需要刷新

private void partialRefresh(ListView listview, int position){
	if(position >= listView.getFisrtVisiblePosition() && position <= listview.getLastVisiblePosition()){
		int childIndex = position - listView.getFirstvisblePosition();
		View child = listView.getChildAt(childIndex);
		if(child.getTag() instanceof ViewHolder){
		((ViewHolder)child.getTag()).refreshContent(datas.get(postion).getContent)}
	}
}


ViewHolder.refreshContent方法

baseAdapter中的

private static class ViewHolder {
	

	private TextView time;
	private TextView name;
	public View Holder(Textview time, TextView name){
		this.time = time;
		this.name = name
	}
	public TextView getTime(){
		return time;
	}
	public TextView getName(){
		return name;
	}

	public void refreshContent(String content){
		this.name.setText(content)
	}
}

八、HeaderView FooterView EmptView

//添加HeaderView
listView.addHeaderView(headerView);
listView.removeHeaderView(headerView);

//添加FooterView
listView.addFooterView(footerView);
listView.removeFooterView(footerView);

//设置EmptyView
listView.setEmptyView(emptyView);
上一篇:第20章 得心应手的“粘合剂”——适配器模式


下一篇:ListView在delphi中的常用用法