- 首先打造超级Viewholder
package com.ljh.powerfulladapter.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class CommonViewHolder {
private int mPosition;
/*
* 用于存储holder里面的各个view,此集合比map效率高,但key必须为Integer
*/
private SparseArray<View> mViews;
/**
* 复用的view
*/
private View convertView;
private CommonViewHolder(Context context,int position, int layoutId, ViewGroup parent) {
this.mPosition = position;
mViews = new SparseArray<View>();
convertView = LayoutInflater.from(context).inflate(layoutId, parent,false);
convertView.setTag(this);
}
public static CommonViewHolder getInstance(Context context,int layoutId,int position, View convertView, ViewGroup parent) {
if (convertView == null) {
return new CommonViewHolder(context, position, layoutId, parent);
} else {
CommonViewHolder holder = (CommonViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
/**
* 通过resourceId获取item里面的view
* @param resourceId 控件的id
* @return
*/
@SuppressWarnings("unchecked")
public <T extends View> T getView(int resourceId) {
View view = mViews.get(resourceId);
if (view == null) {
view = convertView.findViewById(resourceId);
mViews.put(resourceId, view);
}
return (T) view;
}
/**
* 为textview类型填充内容
* @param resourceId
* @param text
* @return CommonViewHolder
*/
public CommonViewHolder setText(int resourceId,CharSequence text ) {
((TextView) getView(resourceId)).setText(text);
return this;
}
public CommonViewHolder setText(int resourceId,int resid ) {
((TextView) getView(resourceId)).setText(resid);
return this;
}
/**
* 为ImageView设置Bitmap
* @param resourceId
* @param bm
* @return
*/
public CommonViewHolder setBitmap(int resourceId,Bitmap bm) {
((ImageView)getView(resourceId)).setImageBitmap(bm);
return this;
}
public CommonViewHolder setImageDrawable(int resourceId,Drawable drawable) {
((ImageView)getView(resourceId)).setImageDrawable(drawable);
return this;
}
public CommonViewHolder setImageResource(int resourceId,int resId) {
((ImageView)getView(resourceId)).setImageResource(resId);
return this;
}
public View getConvertView() {
return convertView;
}
/**
* 获取当前item的位置
* @return
*/
public int getPosition() {
return mPosition;
}
}
- 打造超级BaseAdapter
package com.ljh.powerfulladapter.util;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.ljh.powerfulladapter.R;
public abstract class CommonBaseAdapter<T> extends BaseAdapter {
private Context mContext;
private List<T> mDatas;
public CommonBaseAdapter(Context context,List<T> datas) {
this.mContext = context;
this.mDatas = datas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CommonViewHolder holder = CommonViewHolder.getInstance(mContext, R.layout.listview_item, position, convertView, parent);
convert(holder,mDatas.get(position));
return holder.getConvertView();
}
/**
* 填充holder里面控件的数据
* @param holder
* @param bean
*/
public abstract void convert(CommonViewHolder holder,T bean);
}
- 使用范例
这是MainActivity
public class MainActivity extends Activity {
private ListView listView;
private List<Bean> mDatas;
// private MyAdapter adapter;
private CommonAdapter commonAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDatas();
initView();
regisetListener();
}
@SuppressWarnings("deprecation")
private void initDatas() {
mDatas = new ArrayList<Bean>();
for (int i = 0 ; i < 20; i ++) {
mDatas.add(new Bean("Android 新技术" + i, "android 新技术,可以让你走上人生高富贵道路,不信,就来学吧!", "1231212112" + i, new Date().toLocaleString()));
}
}
private void initView() {
listView = (ListView) findViewById(R.id.listview);
// adapter = new MyAdapter(this, mDatas);
// listView.setAdapter(adapter);
commonAdapter = new CommonAdapter(this, mDatas);
listView.setAdapter(commonAdapter);
}
private void regisetListener() {
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Bean bean = mDatas.get(position);
Toast.makeText(MainActivity.this, bean.getTitle(), Toast.LENGTH_SHORT).show();
}
});
}
}
main.xml布局
<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="com.ljh.powerfulladapter.MainActivity" >
<ListView
android:id="@+id/listview"
android:dividerHeight="2dip"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
CommonAdapter 源码:
public class CommonAdapter extends CommonBaseAdapter<Bean> {
public CommonAdapter(Context context,List<Bean> datas) {
super(context, datas);
}
@Override
public void convert(CommonViewHolder holder,final Bean bean) {
holder.setText(R.id.title, bean.getTitle())
.setText(R.id.desc, bean.getDesc())
.setText(R.id.time, bean.getTime())
.setText(R.id.phone, bean.getPhone());
holder.setImageResource(R.id.timeMake, R.drawable.time_mark);
//这个当布局里面有checkbox的时候,复用问题的解决
final CheckBox cb = holder.getView(R.id.checkbox);
cb.setChecked(bean.isCheck());
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bean.setCheck(cb.isChecked());
}
});
}
}
listview_item.xml布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:descendantFocusability="blocksDescendants"
android:layout_height="match_parent" >
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:singleLine="true"
android:text="Android 新技术1"
android:textColor="#000"
android:textSize="18sp" />
<LinearLayout
android:id="@+id/llDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dip"
android:orientation="horizontal" >
<TextView
android:id="@+id/desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="7"
android:maxLines="2"
android:text="Android 新技术1"
android:textSize="16sp" />
<CheckBox
android:id="@+id/checkbox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/llDesc" >
<ImageView
android:id="@+id/timeMake"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dip" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dip"
android:layout_toRightOf="@id/timeMake"
android:singleLine="true"
android:text="2015-4-18"
android:textSize="14sp" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:layout_marginTop="5dip"
android:background="#00ff00"
android:singleLine="true"
android:text="10086"
android:textSize="14sp" />
</RelativeLayout>
</RelativeLayout>
这是用用的Bean实体:
public class Bean {
private String title;
private String desc;
private String phone;
private String time;
//这个当布局里面有checkbox的时候,复用问题的解决
private boolean isCheck;
//略去get/set等...
}
以上信息参考慕课网的hyman老师的视频,在此谢谢。