研究了下ListView的自定义item view:
首先,建立一个layout:



	
	

显示结果如下:

*我在这里新建了一个包,用于存放所有view:com.zhang.test.view
然后新建一个类:DemoListItemView 继承自LinearLayout,如果自定义view使用的是其他Layout,那么就继承自其他的Layout,比如RelativeLayout等等。

写入代码:

package com.zhang.test.view;

import java.util.zip.Inflater;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.zhang.test.R;

public class DemoListItemView extends LinearLayout {

	private static final String TAG = "DemoListItemView";
	private Context context;
	private TextView topTextView, bottomTextView;

	public DemoListItemView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initialize(context);
	}

	public DemoListItemView(Context context) {
		super(context);
		initialize(context);
	}

	private void initialize(Context context) {
		this.context = context;
		View view = LayoutInflater.from(this.context).inflate(R.layout.demo_list_item_view, null);
		topTextView = (TextView) view.findViewById(R.id.topTextView);
		bottomTextView = (TextView) view.findViewById(R.id.bottomTextView);
		addView(view);
	}

	public void updateView(Data d) {
		topTextView.setText(d.topText);
		bottomTextView.setText(d.bottomText);
	}

	/**
	 * 自定义数据类型,用于显示当前item所需要的数据
	 * @author zhang
	 *
	 */
	public static final class Data {

		public String topText;
		public String bottomText;

		public Data() { }

		public Data(Data d) {
			topText = d.topText;
			bottomText = d.bottomText;
		}
	}
}

这里面有个内部类:Data。
通常每一个ListView的item都会显示不同内容,那么把每一个item要显示的内容封装成一个类方便赋值。

接下来是Adapter,新建一个类:DemoListAdapter 继承自BaseAdapter。
我在这里也建立了一个包,用于存放所有adapter:com.zhang.test.adapter

package com.zhang.test.view.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.zhang.test.view.DemoListItemView;

public class DemoListAdapter extends BaseAdapter {

	private static final String TAG = "DemoListAdapter";
	private Context context;
	private ArrayList datas;

	public DemoListAdapter(Context context) {
		this.context = context;
	}

	public DemoListAdapter(Context context, ArrayList datas) {
		this.context = context;
		this.datas = datas;
	}

	public void setDatas(ArrayList datas) {
		this.datas = datas;
	}

	public int getCount() {
		return datas.size();
	}

	public Object getItem(int location) {
		return datas.get(location);
	}

	public long getItemId(int location) {
		return location;
	}

	public View getView(int location, View view, ViewGroup parent) {
		if(datas == null) {
			return null;
		}
		if(view == null) {
			DemoListItemView itemView = new DemoListItemView(context);
			itemView.updateView(datas.get(location));
			view = itemView;
		} else {
			((DemoListItemView) view).updateView(datas.get(location));
		}
		return view;
	}

}

adapter中最重要的是getView:
通过重写BaseAdapter中的方法,在实例化这个adapter时传入要显示的数据,然后用getView来显示每一个ListView的item,通过实例化刚才建立的View:DemoListItemView的方法updateView传入要显示在当前位置的数据项,然后返回处理完毕的view。

然后是activity的layout:
layout中只有一个ListView,我们通过在activity中载入数据,然后把数据传给刚才的 DemoListAdapter 的对象,再通过这个ListView的setAdapter方法把数据显示出来。



	
	

activity:

package com.zhang.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;

import com.zhang.test.view.DemoListItemView;
import com.zhang.test.view.adapter.DemoListAdapter;

public class demoActivity extends Activity {

	private static final String TAG = "demoActivity";
	private Context context;
	private ListView listView;
	private ArrayList datas;
	private DemoListAdapter datasAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = this;
        listView = (ListView) findViewById(R.id.listView);
        datas = new ArrayList();
        loadData();
        datasAdapter = new DemoListAdapter(context, datas);
        listView.setAdapter(datasAdapter);
    }

    private void loadData() {
    	DemoListItemView.Data d;
    	for(int i=0; i<10; i++) {
    		d = new DemoListItemView.Data();
    		d.topText = "测试top";
    		d.bottomText = "测试bottom";
    		datas.add(d);
    	}
    }
}

activity中定义的几个变量:
listView:layout文件中的ListView
datas:自定义item的view要显示的数据
datasAdapter:DemoListAdapter实例化的对象,赋值后显示在ListView中

整个程序结构:

最终运行结果:

源码下载:
DemoListView.zip

Trackback

no comment untill now

Add your comment now

请输入正确答案: 6+9= (required)