您的位置:首页 > 其它

适配器的封装

2016-08-22 18:18 176 查看
上一节我们讲了 封装AsyncTask异步请求网络 今天我们来封装Android开发经常用到的适配器

已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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: