今天的例子是关于在Android中实现一个万能的适配器,以减少重复的代码编写和提高代码效率。我将直接贴出代码供大家参考。

1.实现自定义的ViewHolder类:

package com.example.test.utils;


import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;


/**
* ViewHolder
* @author 宋小亮
*
*/
public class ViewHolder {



private SparseArray<View> mViews;//存放view
private int mPosition;//Item的position
private View mConvertview;//加载的视图View

/**
* 构造方法中对数据进行初始化并加载视图View,以及将ViewHolder实例设置成convertView的tag
* @param context
* @param parent
* @param layoutId
* @param position
* @param mInflater
*/
public ViewHolder(Context context,ViewGroup parent,int layoutId,int position,LayoutInflater mInflater){
this.mViews = new SparseArray<View>();
this.mPosition = position;
this.mConvertview = mInflater.inflate(layoutId, parent,false);
mConvertview.setTag(this);
}

/**
* 获取ViewHolder实例
* @param context
* @param convertview
* @param parent
* @param layoutId
* @param position
* @param mInflater
* @return
*/
public static ViewHolder get(Context context,View convertview,ViewGroup parent,int layoutId,int position,LayoutInflater mInflater){

if(convertview == null){
return new ViewHolder(context,parent,layoutId,position,mInflater);
}else{
ViewHolder holder = (ViewHolder)convertview.getTag();
holder.mPosition = position;
return holder;
}

}

/**
* 通过viewId获取控件
* @param resId
* @return
*/
public <T extends View> T getView(int resId){

View view = mViews.get(resId);
if(view == null){
view = mConvertview.findViewById(resId);
mViews.put(resId, view);
}
return (T) view;
}


public View getmConvertview() {
return mConvertview;
}

/**
* 设置TextView显示文本
* @param resId
* @param str
* @return
*/
public ViewHolder setText(int resId,String str){
TextView tv = (TextView)this.getView(resId);
tv.setText(str);
return this;
}
/**
* 设置ImageView显示
*/
public ViewHolder setImageResources(int resId,int rid){
ImageView iv = (ImageView)this.getView(resId);
iv.setImageResource(rid);
return this;
}
/**
* 设置ImageView显示成Bitmap
* @param resId
* @param bm
* @return
*/
public ViewHolder setImageBitmap(int resId,Bitmap bm){
ImageView iv = (ImageView)this.getView(resId);
iv.setImageBitmap(bm);
return this;
}

}

2.实现自定义的公共的Adapter父类

package com.example.test.utils;


import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
/**
* Adapter公共类
* @author 宋小亮
*
* @param <T>
*/
public abstract class CommonAdapter<T> extends BaseAdapter{


protected List<T> mList;
private int layoutId;
protected Context mContext;
protected LayoutInflater mInflater;

public CommonAdapter(Context context,List<T> list,int layoutId){
this.mContext = context;
this.mList = list;
this.layoutId = layoutId;
this.mInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mList.size();
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mList.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 viewHolder = ViewHolder.get(mContext, convertView, parent,layoutId, position,mInflater);
//交给子类去重写该方法,实现自定义
commonView(viewHolder,mList.get(position));
return viewHolder.getmConvertview();
}


public abstract void commonView(ViewHolder viewHolder,T obj);
}

3.在我们自己的Adapter类中,我们只需要实现commonView方法:

package com.example.test;


import java.util.List;


import com.example.test.utils.CommonAdapter;
import com.example.test.utils.ViewHolder;


import android.content.Context;


/**
* 自定义Adapyer
* @author 宋小亮
*
*/
public class ListViewAdapter extends CommonAdapter<Bean>{


public ListViewAdapter(Context context, List<Bean> list) {
super(context, list,R.layout.list_content);
}


/**
* 实现该方法,在该方法中调用设置方法进行数据的显示即可
*/
@Override
public void commonView(ViewHolder viewHolder, Bean obj) {
viewHolder.setText(R.id.tv_first, obj.name).
setText(R.id.tv_second, obj.age);
}


}

至此,一个万能的适配器就大功告成!

更多相关文章

  1. android利用广播和服务实现一个杀不死的流氓应用
  2. Android×××方法详解
  3. Android(安卓)P 系统设置默认值
  4. Android(安卓)进阶16:IntentService 使用及源码解析
  5. YAHFA hook的简单实例 ,hook自己的android应用
  6. Xamarin 中开发Android实现全屏或者不显示标题栏的方法-宋兴柱
  7. ArcGIS API For Android离线地图的实现
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. mysql插入数字变成2147483647的解决方法
  2. JS中常量变量及函数的理解
  3. JS异步编程模型
  4. 前端 JavaScript 实现一个简易计算器
  5. 养猪场小游戏如何制作?
  6. 字体图标引用、无序列表颜色设置、盒模型
  7. 模板字面量与标签函数
  8. 模板字面量与标签函数,解构赋值
  9. 前端作业-flex布局
  10. 纯业余40岁大叔立个flag,开始折腾php,晚是