我们在项目开发中,经常会和适配器(Adapter)打交道,仔细观察,适配器里面有好多代码都可以进行重构,所以,是时候打造属于你的万能适配器。

一.基本做法(旧的做法)

1.新建项目;

2.新建布局文件activity_main.xml,创建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"    >    <ListView        android:id="@+id/id_lv"        android:layout_width="match_parent"        android:layout_height="match_parent"        /></RelativeLayout>

新建适配器item布局文件,adapter_item.xml(显示2个TextView),

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="12dp"    android:descendantFocusability="blocksDescendants"    android:orientation="vertical" >    <TextView        android:id="@+id/id_tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <TextView        android:id="@+id/id_tv_age"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></LinearLayout>

3.新建实体类-Bean(测试实体类);

public class Bean {private String name;private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public Bean(String name, String age) {super();this.name = name;this.age = age;}}

4.新建适配器-MyAdapter1;

public class MyAdapter1 extends BaseAdapter {private List<Bean> mData;private LayoutInflater inflater;public MyAdapter1(Context context,List<Bean> data) {mData=data;inflater=LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mData.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHolder holder;if(convertView==null){holder=new ViewHolder();convertView=inflater.inflate(R.layout.adapter_item, parent, false);holder.tvName=(TextView) convertView.findViewById(R.id.id_tv_name);holder.tvAge=(TextView) convertView.findViewById(R.id.id_tv_age);convertView.setTag(holder);}else{holder=(ViewHolder) convertView.getTag();}Bean bean=mData.get(position);holder.tvName.setText(bean.getName());holder.tvAge.setText(bean.getAge());return convertView;}private class ViewHolder {TextView tvName;TextView tvAge;}}

以上这些代码都很简单,就不解释了!

5.新建Activity-MainActivity;

public class MainActivity extends Activity {private MyAdapter1 adapter1;private ListView lv;private List<Bean> mData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv=(ListView) findViewById(R.id.id_lv);mData=new ArrayList<Bean>();initData();adapter1=new MyAdapter1(this, mData);lv.setAdapter(adapter1);}//加载模拟数据private void initData() {Bean bean=new Bean("zhangsan","12");mData.add(bean); bean=new Bean("lisi","23");mData.add(bean); bean=new Bean("wangwu","32");mData.add(bean); bean=new Bean("liuer","42");mData.add(bean); bean=new Bean("yuyi","51");mData.add(bean); bean=new Bean("xuba","64");mData.add(bean); bean=new Bean("wujiu","73");mData.add(bean); bean=new Bean("tushi","87");mData.add(bean);bean=new Bean("guoqi","90");mData.add(bean);bean=new Bean("renliu","13");mData.add(bean);}}

以上就是最普通、最通常的做法。

二.代码重构(新的做法)

1.新建项目;

2.新建布局文件activity_main.xml,创建ListView控件,新建适配器item布局文件,adapter_item.xml(显示2个TextView);

3.新建实体类-Bean(测试实体类);(前面这几步都一样)

4.新建ViewHolder类,该类封装之前在适配器中的一些代码;

//构造方法 -加载布局public ViewHolder(Context context, ViewGroup parent, int layoutId,int position) {array = new SparseArray<View>();mPosition = position;mConverView = LayoutInflater.from(context).inflate(layoutId, parent,false);mConverView.setTag(this);}
//获取ViewHolder-如果convertView是空,则去创建布局,并返回ViewHolder;否则,返回已经存在的ViewHolderpublic static ViewHolder getViewHodler(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;}}
//获取控件,通过ViewIdpublic <T extends View> T getView(int viewId) {View view = array.get(viewId);if (view == null) {view = mConverView.findViewById(viewId);array.put(viewId, view);}return (T) view;}
以上就是一些必要的方法;

5.新建CommonAdapter类,该类实现在适配器中一些重复的代码;

public abstract class CommonAdapter<T> extends BaseAdapter {public List<T> mData;private Context mContext;private int mLayoutId;public CommonAdapter(Context context, List<T> data,int layoutId) {mContext = context;mData = data;mLayoutId=layoutId;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic T getItem(int position) {// TODO Auto-generated method stubreturn mData.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic  View getView(int position, View convertView,ViewGroup parent){ViewHolder holder=ViewHolder.getViewHodler(mContext, convertView, parent, mLayoutId, position);convert(holder, mData.get(position));return holder.getmConverView();}
//子适配器通过这个方法去实现具体的操作public abstract void convert(ViewHolder holder,T t);}
6.新建MyAdapter2类,只需要很简单的几行就可以了;

public class MyAdapter2 extends CommonAdapter<Bean>  {public MyAdapter2(Context context, List<Bean> data) {super(context, data, R.layout.adapter_item);}@Overridepublic void convert(com.example.projectfast.adapter.fast.ViewHolder holder,Bean bean) {holder.setText(R.id.id_tv_name,bean.getName()).setText(R.id.id_tv_age, bean.getAge());}}
万能适配器的代码基本上就完了,在activity中万能适配器的使用方法和一般的适配器都一样!代码量很少吧!

三.总结

在实际项目中使用这样的万能适配器,确实比之前的代码量少了很多!并且,这个万能适配器的实现也不是很复杂!要是你觉得不理解或者有些枯燥,那么请去慕课网看看鸿洋大牛的视频吧!值得推荐!

推荐和项目有关的文章,Android 项目开发框架。

代码下载链接

PS:这篇文章是看了鸿洋大牛的视频后,写的!在此,非常感谢慕课网以及鸿洋大牛!希望有更多更好的视频以及文章可以分享!

更多相关文章

  1. android native crash日志解析
  2. 【Android】关于Android控件EditText的属性InputType的一些经验
  3. Android(安卓)Fragment 基本了解
  4. Android(安卓)设置全屏和无标题模式
  5. Android关机和重启的调用代码
  6. Android(安卓)自定义弹性ListView控件实例代码(三种方法)
  7. [Android1.5]DigitalClock自定义日期输出格式
  8. 使用AIDL实现进程间的通信
  9. 打开和关闭WIFI 的代码出现了问题 android

随机推荐

  1. Android studio 3.0 and Gradle3.0 JNI
  2. Android中的PopupWindows用法
  3. 关于Android中的Scheme
  4. Android进入页面开始就自动弹出软键盘
  5. android sqlite3 数据库升级,加字段
  6. Android(安卓)OpenGL ES 开发教程(10):绘
  7. Android调用系统自带的文件管理器,打开指
  8. Cocos2d-x 3.4在AndroidStudio上编译配置
  9. 【Android】监听Notification被清除
  10. Android如何使用OKHttp