适配器的封装
2016-08-22 18:18
176 查看
上一节我们讲了 封装AsyncTask异步请求网络 今天我们来封装Android开发经常用到的适配器
已ListView为例:
1、常见的Adapter
上面这段代码是我们最常见的,相信大家都非常 非常 非常 (重要的事说三遍)熟悉
这段代码几乎每新建一个Adapter 都会用到,还是那句话,禁止重复造轮子
首先 BaseAdapter 的简易封装
我们把Adapter 封装完以后就没事了吗?NO 再看下面这段代码
上面这段代码也是重复的,每个getView()里我们几乎都要写一遍,要回拒绝说:NO
接下来我们封装ViewHolder,下面这段代码也很简单,逻辑清楚,大家看注释吧
OK 我们的ViewHolder CommentAdapter 已封装完毕,如何使用呢?
这样我们的代码又优化了好多,而且性能也提高了
已ListView为例:
1、常见的Adapter
class MyAdapter extends BaseAdapter{ @Override public int getCount() { return mDatalist.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder holder = new ViewHolder(); if (convertView == null){ convertView = LayoutInflater.from(getActivity()).inflate(R.layout.goods_list_item, null); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.tvTitle = (TextView) convertView.findViewById(R.id.title); holder.tvTitle.setText(mDatalist.get(position).getTitle()); return convertView; } } static class ViewHolder{ TextView tvTitle; }
上面这段代码是我们最常见的,相信大家都非常 非常 非常 (重要的事说三遍)熟悉
public int getCount() { return mDatalist.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; }
这段代码几乎每新建一个Adapter 都会用到,还是那句话,禁止重复造轮子
首先 BaseAdapter 的简易封装
** * T 泛型可传递任何数据 * Created by Administrator on 2016/8/22 0022. * BaseAdapter 的简易封装 */ public abstract class CommentAdapter<T> extends BaseAdapter { List<T> mDatas = new ArrayList<>(); public CommentAdapter(List<T> datas, Context context) { mDatas = datas; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int i) { return mDatas.get(i); } @Override public long getItemId(int i) { return i; } }
我们把Adapter 封装完以后就没事了吗?NO 再看下面这段代码
@Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder holder = new ViewHolder(); if (convertView == null){ convertView = LayoutInflater.from(getActivity()).inflate(R.layout.goods_list_item, null); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.tvTitle = (TextView) convertView.findViewById(R.id.title); holder.tvTitle.setText(mDatalist.get(position).getTitle()); return convertView; } } static class ViewHolder{ TextView tvTitle; }
上面这段代码也是重复的,每个getView()里我们几乎都要写一遍,要回拒绝说:NO
接下来我们封装ViewHolder,下面这段代码也很简单,逻辑清楚,大家看注释吧
import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * ViewHolder 的封装 */ public class ViewHolder { private View mConverView; //效率较高 key只能是integer SparseArray<View> mViews=null; public ViewHolder(Context context, int layoutID, ViewGroup parent) { mViews = new SparseArray<>(); mConverView = LayoutInflater.from(context).inflate(layoutID, parent, false); mConverView.setTag(this); } /** * 创建一个viewholder对象 * @param converview * @param context * @param layoutID * @param parent * @return */ public static ViewHolder get(View converview,Context context, int layoutID, ViewGroup parent){ if (converview == null){ return new ViewHolder(context,layoutID,parent); } return (ViewHolder) converview.getTag(); } /** * 找到控件的ID * @param viewID * @param <T> * @return */ public <T extends View> T getView(int viewID){ View view = mViews.get(viewID); if (view == null){ view=mConverView.findViewById(viewID); mViews.put(viewID,view); } return (T) view; } /** * 返回view * @return mConverView */ public View getConverView(){ return mConverView; } }
OK 我们的ViewHolder CommentAdapter 已封装完毕,如何使用呢?
这样我们的代码又优化了好多,而且性能也提高了
public class ListAdapter extends CommentAdapter<GoodsInfo.ResultBean.GoodlistBean> { List<GoodsInfo.ResultBean.GoodlistBean> goodlist = new ArrayList<>(); private Context mContext; public ListAdapter(List<GoodsInfo.ResultBean.GoodlistBean> datas, Context context) { super(datas, context); goodlist = datas; mContext = context; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder = ViewHolder.get(view, mContext, R.layout.item_recomment_adapter, viewGroup); TextView title = viewHolder.getView(R.id.tv_recomment_title); GoodsInfo.ResultBean.GoodlistBean goodlistBean = goodlist.get(i); if (goodlistBean != null) { title.setText(goodlistBean.getTitle()); } return viewHolder.getConverView(); } }
相关文章推荐
- Listview之万能适配器封装,结合上一篇博客ViewHolder封装类使用
- RecyclerView适配器的简单封装-BaseAdapter
- Listview的适配器封装
- RecyclerView的通用适配器,和滚动时不加载图片的封装
- 封装ViewPager适配器简单封装
- 封装适配器
- RecyclerView的通用适配器,和滚动时不加载图片的封装
- ListView的适配器和Holder的封装
- RecyclerView通用适配器Adapter,对Adapter的封装
- Android适配器之DataModifyHelper数据操作类的封装
- banner适配器封装
- ListView可复用适配器的封装及性能优化
- 反射实现适配器的封装
- 万用适配器(封装通用的基类GeneralAdapter)
- RecyclerView的通用适配器,和滚动时不加载图片的封装
- Android中RecyclerView的适配器的简单封装
- 封装RecyclerView的基础适配器BaseAdapter
- RecyclerView的适配器简单封装,再也不用重复写适配器了
- RecyclerView适配器的封装,针对于要加载数据、没有更多,没有数据的情况的处理
- 基类适配器封装