我们在做android app开发的过程中,很多地方都用到了ListView和GridView,这其中就包含Adapter,传统的写法是为每一个ListView写一个适配器,比如:
public class MyAdapter extends BaseAdapter { @Override public int getCount() { return 0; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { return null; } class ViewHolder{ } }上面的例子大家应该很熟悉,也不会报什么错。但是你想过没有,如果你的项目中ListView的使用次数比较多,这样你每一次都要重写大量的代码,所以这样作法的复用性并不高,下面为大家讲一种打造万能适配器的方法:
1:首先想到要把ViewHolder类提出来
import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by Administrator on 2018/1/5. */ public class ViewHolder { private SparseArray<View> mViews; private Context mContext; private View mConvertView; private int mPosition; public View getmConvertView() { return mConvertView; } public int getmPosition() { return mPosition; } private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(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; } } public <T extends View> T getView(int viewId){ View view = mViews.get(viewId); if (view == null){ view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public ViewHolder setText(int viewId, String text){ TextView tv = getView(viewId); tv.setText(text); return this; } }需要讲解几点:存放view的容器用的是SparseArray,而没用用HashMap,是因为前者的性能更优。
T(泛型)更有利于程序的扩展。其它应该没有很复杂的代码。
2:封装SuperAdapter:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.List; /** * Created by Administrator on 2018/1/5. */ public abstract class SuperAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mDatas; protected LayoutInflater mInflater; private int layoutId; public SuperAdapter(Context context, List<T> datas, int layoutId) { this.mContext = context; this.mDatas = datas; this.layoutId = layoutId; mInflater = LayoutInflater.from(context); } public Context getmContext() { return mContext; } public void setmContext(Context mContext) { this.mContext = mContext; } public List<T> getmDatas() { return mDatas; } public void setmDatas(List<T> mDatas) { this.mDatas = mDatas; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int i) { return mDatas.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder = ViewHolder.get(mContext, view, viewGroup, layoutId, i); convert(holder, getItem(i), i); return holder.getmConvertView(); } protected abstract void convert(ViewHolder holder, T t, int i); }是不是发现getView中的代码少了很多,抽象方法convert给具体的adapter去实现,下面会讲到。
3:编写自己的adapter继承SuperAdapter:
import android.content.Context; import android.util.Log; import android.widget.CheckBox; import android.widget.CompoundButton; import java.util.List; /** * Created by Administrator on 2018/1/5. */ public class InfoAdapter extends SuperAdapter<User> { public InfoAdapter(Context context, List<User> datas, int layoutId) { super(context, datas, layoutId); } @Override protected void convert(ViewHolder holder, User user, final int i) { holder.setText(R.id.tv_name, user.getName()); holder.setText(R.id.tv_age, user.getAge() + ""); holder.setText(R.id.tv_motto, user.getMotto()); CheckBox c = holder.getView(R.id.cb_item); c.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { Log.e("m_tag", "checked: " + i); } else { Log.e("m_tag", "check false:" + i); } } }); } }主需要实现传参和实现convert方法就可以了,是不是代买简洁了很多,如果有什么地方不对的,欢迎大家指正,谢谢!没看 清楚的可以 看看源码。