研究了下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



no comment untill now