我们在项目开发中,经常会和适配器(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);
}
@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:这篇文章是看了鸿洋大牛的视频后,写的!在此,非常感谢慕课网以及鸿洋大牛!希望有更多更好的视频以及文章可以分享!