您的位置:首页 > 其它

ListView 显示多种itemView布局的简单实现

2015-03-10 15:03 411 查看

参考:http://blog.csdn.net/bill_ming/article/details/8817172

需要了解的知识点:
ViewHolder的作用
convertView是什么
getItemViewType方法

这些知识点可以百度搜索,多看一些人的解释。

实例图如下:
在一个listView中,每行显示一个Item。其中有两种布局格式,一个是只含有一个TextView的,一种是含有两个TextView的。例子很简单。



代码部分:
1、完成三种布局
左边的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/il_tv_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="XXXXXXXXXXX"/>

</RelativeLayout>
中间的
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/il_tv_middle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="XXXXXXXXXXX"/>

    <TextView
        android:id="@+id/il_tv_tip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/il_tv_middle"
        android:textColor="#C0FF3E"
        android:textStyle="bold"
        android:text="show" />

</RelativeLayout>
右边的
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/il_tv_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="XXXXXXXXXXX"/>

</RelativeLayout>


2、编写Item类
每个Item有两个属性,一个是显示的字,一个是所属类型,这里的类型是所处位置
public class StringItem {
	
	private String txt;
	private Type type;

	public StringItem(String txt,Type type) {
		this.txt = txt;
		this.type = type;
	}

	public String getTxt() {
		return txt;
	}
	
	public void setTxt(String txt) {
		this.txt = txt;
	}
	
	public Type getType() {
		return type;
	}
	
	public void setType(Type type) {
		this.type = type;
	}
	
	public enum Type{
		LEFT,MIDDLE,RIGHT
	}
}


3、实现适配器的编写
public class StringAdapter extends BaseAdapter {

	private List<StringItem> datasItems;
	private LayoutInflater mInflater;
	private Context mContext;
	
	public StringAdapter(Context mContext,List<StringItem> datas) {
		this.mContext = mContext;
		this.datasItems = datas;
		mInflater = LayoutInflater.from(mContext);
	}

	@Override
	public int getItemViewType(int position) {
		if (datasItems.get(position).getType() == Type.LEFT) {
			return 0;
		} else if (datasItems.get(position).getType() == Type.MIDDLE) {
			return 1;
		} else {
			return 2;
		}
	}

	@Override
	public int getCount() {
		return datasItems.size();
	}

	@Override
	public Object getItem(int position) {
		return datasItems.get(position);
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		ViewHolder viewHolder = null;
		ViewHolderMore viewHolderMore = null;
		int type = getItemViewType(position);
		
		//如果没有convertView,new出控件
		if(convertView == null ){
			if(getItemViewType(position) == 0){
				convertView = mInflater.inflate(R.layout.item_left, parent,false);
				viewHolder = new ViewHolder();
				viewHolder.textView = (TextView)convertView.findViewById(R.id.il_tv_left);
				convertView.setTag(viewHolder);
			}else if(getItemViewType(position)==1){
				convertView = mInflater.inflate(R.layout.item_middle, parent,false);
				viewHolderMore = new ViewHolderMore();
				viewHolderMore.textView = (TextView)convertView.findViewById(R.id.il_tv_middle);
				viewHolderMore.showTV = (TextView)convertView.findViewById(R.id.il_tv_tip);
				convertView.setTag(viewHolderMore);
			}else {
				convertView = mInflater.inflate(R.layout.item_right, parent,false);
				viewHolder = new ViewHolder();
				viewHolder.textView = (TextView)convertView.findViewById(R.id.il_tv_right);
				convertView.setTag(viewHolder);
			}
		//如果有convertView,按照样式取得不同的布局
		}else{
			if(getItemViewType(position) == 0 || getItemViewType(position)==2){
				viewHolder = (ViewHolder)convertView.getTag();
				try {
					Log.e("", "getView方法中-------->:(ViewHolder)convertView.getTag()为:" + (ViewHolder)convertView.getTag());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}else{
				viewHolderMore = (ViewHolderMore)convertView.getTag();
			}
		}
		
		//根据类型设置显示
		switch (type) {
		case 0:
			viewHolder.textView.setText(datasItems.get(position).getTxt());
			break;
		case 1:
			viewHolderMore.textView.setText(datasItems.get(position).getTxt());
			viewHolderMore.showTV.setText("SHOW:");
			break;
		case 2:
			viewHolder.textView.setText(datasItems.get(position).getTxt());
			break;

		default:
			break;
		}
		return convertView;
	}
	
	public static class ViewHolder{
		TextView textView;
	}
	
	public static class ViewHolderMore{
		TextView textView;
		TextView showTV;
		
	}

}
4、页面调用

public class MainActivity extends ListActivity {

	private LayoutInflater mLayoutInflater = null;
	private StringAdapter adapter;
	private List<StringItem> mDatas = new ArrayList<StringItem>();
	private Context mContext;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mLayoutInflater = LayoutInflater.from(this);//初始化界面
		mContext = this;

		initData();
		adapter = new StringAdapter(mContext,mDatas);//初始化适配器,并为其赋值
		
		setListAdapter(adapter);//设置适配器
	}

	//初始化显示在ListView中的数据
	private void initData() {
		StringItem item= null;
		for(int i = 0;i<20;i++){
			if(i%3==0){
				 item = new StringItem("No"+i, Type.LEFT);
			}else if(i%3==1){
				item = new StringItem("Mid"+i, Type.MIDDLE);
			}else{
				item = new StringItem("Last"+i, Type.RIGHT);
			}
			mDatas.add(item);
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: