您的位置:首页 > 编程语言

超级封装BaseAdapter,让你省下千万行代码

2015-04-18 17:18 253 查看
首先打造超级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老师的视频,在此谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: