我们在项目开发中,经常会和适配器(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>
<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); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mData.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) { // TODO Auto-generated method stub ViewHolder 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; @Override protected 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;否则,返回已经存在的ViewHolder public 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; } }
//获取控件,通过ViewId public <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; } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public T getItem(int position) { // TODO Auto-generated method stub return mData.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.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); } @Override public 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:这篇文章是看了鸿洋大牛的视频后,写的!在此,非常感谢慕课网以及鸿洋大牛!希望有更多更好的视频以及文章可以分享!