抽出的ViewHolder通用類
public class ViewHolder {
private SparseArray<View> mViews;private int mPosition;
private View mConvertView;
public ViewHolder(Context context,ViewGroup parent,int layoutId,int position){
this.mPosition=position;
this.mViews=new SparseArray<View>();
mConvertView=LayoutInflater.from(context).inflate(layoutId, parent, false);
mConvertView.setTag(this);
}
public static ViewHolder get(Context context,View convertView,ViewGroup parent,int layoutId,int position){
if(convertView==null){
return new ViewHolder(context, parent, layoutId, position);
}else{
ViewHolder holder=(ViewHolder) convertView.getTag();
holder.mPosition=position;
return holder;
}
}
public <T extends View> T getView(int viewId){
View view=mViews.get(viewId);
if(view==null){
view=mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView() {
return mConvertView;
}
}
//可通用的適配器類,繼承此類可以節省很多代碼,尤其在需要寫很多listview時效果顯著
public abstract class CommonAdapter<T> extends BaseAdapter {
protected Context mContext;
protected List<T> mDatas;
protected LayoutInflater inflater;
private int layoutId;
public CommonAdapter(Context mContext, List<T> mDatas,int layoutId) {
this.mContext = mContext;
this.mDatas = mDatas;
inflater=LayoutInflater.from(mContext);
this.layoutId=layoutId;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mDatas.size();
}
@Override
public T getItem(int position) {
// TODO Auto-generated method stub
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder=ViewHolder.get(mContext, convertView, parent, layoutId, position);
convert(holder,getItem(position));
return holder.getConvertView();
}
public abstract void convert(ViewHolder holder,T t);
}
//需要使用於listview等的適配器實現類
public class My_Adapterwithviewholder extends CommonAdapter<Item> {
public My_Adapterwithviewholder(Context mContext, List<Item> list) {
super(mContext, list,R.layout.list_item);
}
@Override
public void convert(final ViewHolder holder, final Item t) {
// TODO Auto-generated method stub
((TextView) holder.getView(R.id.tv)).setText(t.getName());
((CheckBox) holder.getView(R.id.cb)).setChecked(t.ischecked);
((CheckBox) holder.getView(R.id.cb)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
t.setIschecked(((CheckBox) holder.getView(R.id.cb)).isChecked());
}
});
}
}
//實體類
public class Item implements Serializable{
/**
*
*/
private static final long serialVersionUID = 5757609779606275057L;
public String id;
public String name;
public boolean ischecked;
public boolean isIschecked() {
return ischecked;
}
public void setIschecked(boolean ischecked) {
this.ischecked = ischecked;
}
public Item(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//主activity類
public class MainActivity extends Activity {
private ListView listview;
private List<Item> mList;
private My_Adapterwithviewholder viewholderadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
mList=new ArrayList<Item>();
for(int i=0;i<20;i++){
mList.add(new Item(i+"", "name"+i));
}
viewholderadapter=new My_Adapterwithviewholder(this, mList);
listview.setAdapter(viewholderadapter);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "position: "+arg2, 0).show();
}
});
}
private void initview() {
// TODO Auto-generated method stub
listview=(ListView) findViewById(R.id.listview);
}
}
<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="match_parent"
tools:context=".MainActivity" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="@android:color/transparent"
android:divider="@color/divider_color_middle"
android:dividerHeight="0.5dip"
android:fadingEdge="none"
android:listSelector="@android:color/transparent" />
</RelativeLayout>
//佈局條目的代碼:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="58dip"
android:paddingBottom="10dip"
android:paddingLeft="10dip"
android:descendantFocusability="blocksDescendants"
android:paddingRight="10dip"
android:paddingTop="10dip" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dip"
android:layout_toRightOf="@id/iv"
android:maxLength="18"
android:singleLine="true"
android:text="1111111111"
android:textColor="@color/grayblack_1F1F1F"
android:textSize="22sp" />
<CheckBox
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="18dip"
android:layout_alignParentRight="true"
/>
</RelativeLayout>