最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android 中RecyclerView通用适配器的实现
时间:2022-06-25 23:23:43 编辑:袖梨 来源:一聚教程网
Android 中RecyclerView通用适配器的实现
前言:
SDK的5.0版本出来已经N久了,可以说是已经经过许多人的检验了,里面的新控件不能说是非常完美,但也是非常好用了,其中最让我喜爱的就是RecyclerView了,可以完美替代ListView和GridView(除了添加headerview和footview了,网上有许多解决方式。这个下面会以一种简单的方式顺带解决,肯定为大家省心),而且可以代码动态切换这两种布局方式以及瀑布流布局。相关切换方式网上有很多,大家自行搜索,我就不贴连接了。
相信大家在之前使用listview时肯定一直很厌烦重复编写无数的adapter,当然有那么一部分机智如我的人肯定一直使用着万能适配器。然而RecyclerView要求我们必须使用ViewHolder来实现adapter。这就让许多用惯了万能适配器的人不爽了。今天我就提供一直基于listview万能适配器的实现原理来改良实现的RecyclerView的通用适配器,由于不是教学,切代码比较简单,就不分段讲解了,相信大家看注释就能看懂。
一共两个类,一个是继承了系统的Android.support.v7.widget.RecyclerView.ViewHolder所实现的RViewHolder类,通过他实现任意控件的缓存一个是继承了android.support.v7.widget.RecyclerView.Adapter所实现的RBaseAdapter类。
实现代码:
代码如下 | 复制代码 |
RViewHolder importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.support.v7.widget.RecyclerView.ViewHolder; importandroid.util.SparseArray; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.ImageView; importandroid.widget.TextView;
publicclassRViewHolderextendsViewHolder {
privateContext mContext; privateView mConvertView; privateSparseArray
publicRViewHolder(View itemView) { super(itemView); mConvertView = itemView; this.mViews =newSparseArray }
publicstaticRViewHolder get(Context context, ViewGroup parent,intlayoutId,intposition) { View view = LayoutInflater.from(context).inflate(layoutId, parent,false); returnnewRViewHolder(view); }
/** * 通过控件的Id获取对于的控件,如果没有则加入views * * @param viewId * @return */ public
View view = mViews.get(viewId); if(view ==null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return(T) view; }
/** * 为TextView设置字符�? * * @param viewId * @param text * @return */ publicViewHolder setText(intviewId, String text) { TextView view = getView(viewId); view.setText(text); returnthis; }
/** * 为ImageView设置图片 * * @param viewId * @param drawableId * @return */ publicViewHolder setImageResource(intviewId,intdrawableId) { ImageView view = getView(viewId); view.setImageResource(drawableId);
returnthis; }
/** * 为ImageView设置图片 * * @param viewId * @param drawableId * @return */ publicViewHolder setImageBitmap(intviewId, Bitmap bm) { ImageView view = getView(viewId); view.setImageBitmap(bm); returnthis; }
publicView getConvertView() { returnmConvertView; } } 这里是RBaseAdapter importjava.util.ArrayList; importjava.util.Collection; importjava.util.List;
importandroid.content.Context; importandroid.support.v7.widget.RecyclerView.Adapter; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.LinearLayout;
publicabstractclassRBaseAdapter privateContext mContext; privateList protectedLayoutInflater mInflater; privateintmItemLayoutId;
publicRBaseAdapter(Context context) { // TODO Auto-generated constructor stub this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mItemLayoutId =newLinearLayout(mContext).getId(); this.list =newArrayList
}
publicRBaseAdapter(Context context, List // TODO Auto-generated constructor stub this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mItemLayoutId =newLinearLayout(mContext).getId(); this.list = list;
}
publicRBaseAdapter(Context context, List this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mItemLayoutId = itemLayoutId; this.list = list;
}
publicRBaseAdapter(Context context,intitemLayoutId) { this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mItemLayoutId = itemLayoutId; this.list =newArrayList
}
publicvoidsetitemLayoutId(intitemLayoutId) { this.mItemLayoutId = itemLayoutId; }
publicList returnthis.list; }
publicvoidappendList(List // TODO Auto-generated method stub this.list = list; notifyDataSetChanged(); }
publicvoidaddList(List // TODO Auto-generated method stub this.list.addAll((Collection) list2); notifyDataSetChanged(); }
@Override publicintgetItemCount() { returnlist.size();
}
booleanhasHeader =false; booleanhasFooter =false; View headerView; View footerView;
publicvoidsetHeaderView(View headerView) { hasHeader=true; this.headerView = headerView; }
publicvoidsetFooterView(View footerView) { hasFooter =true; this.footerView = footerView; }
publicView getHeaderView() { returnheaderView; }
publicView getFooterView() { returnfooterView; }
@Override publicvoidonBindViewHolder(RViewHolder holder,intposition) { if(hasHeader && position ==0) { return; }elseif(hasFooter && position == (list.size() + (hasHeader ?1:0))) { return; }else convert(holder, (T) list.get(position)); }
@Override publicRViewHolder onCreateViewHolder(ViewGroup parent,intposition) { if(hasHeader && position ==0) { returnnewRViewHolder(headerView); }elseif(hasFooter && position == (list.size() + (hasHeader ?1:0))) { returnnewRViewHolder(footerView); }else returnRViewHolder.get(mContext, parent, mItemLayoutId, position);
} //这里定义抽象方法,我们在匿名内部类实现的时候实现此方法来调用控件 publicabstractvoidconvert(RViewHolder holder, T item); } 对于RBaseAdapter稍微讲解下,首先是泛型,这样任何对象类型都可以使用,再来就是前面提到的headerview和footerview的解决,可以看到RBaseAdapter里面定义了几个方法,通过position的不同来加载不同的布局的思想来添加headerview和footerview。 Activity里面调用 recyclerView.setAdapter(newRBaseAdapter
@Override publicvoidconvert(RViewHolder holder, VirtualWinsBean item) { if(Util.checkNULL(item.getNick_name())) { holder.setText(R.id.name, Util.HidePhone(item.getPhone() +"")); }else{ holder.setText(R.id.name, item.getNick_name()); } RoundImageView networkImageView = holder.getView(R.id.photo); networkImageView.setLoadingImage(R.drawable.header_def); networkImageView.setDefultImage(R.drawable.header_def); networkImageView.LoadUrl(U.g(item.getFile_url())); } }); |
相关文章
- 王者荣耀侦探能力大测试攻略 王者荣耀侦探能力大测试怎么过 11-22
- 无期迷途主线前瞻兑换码是什么 11-22
- 原神欧洛伦怎么培养 11-22
- 炉石传说网易云音乐联动怎么玩 11-22
- 永劫无间手游确幸转盘怎么样 11-22
- 无期迷途主线前瞻兑换码是什么 无期迷途主线前瞻直播兑换码介绍 11-22