国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 中RecyclerView通用適配器的實(shí)現(xiàn)

2019-12-12 03:15:52
字體:
供稿:網(wǎng)友

Android 中RecyclerView通用適配器的實(shí)現(xiàn)

前言:

SDK的5.0版本出來已經(jīng)N久了,可以說是已經(jīng)經(jīng)過許多人的檢驗(yàn)了,里面的新控件不能說是非常完美,但也是非常好用了,其中最讓我喜愛的就是RecyclerView了,可以完美替代ListView和GridView(除了添加headerview和footview了,網(wǎng)上有許多解決方式。這個(gè)下面會(huì)以一種簡(jiǎn)單的方式順帶解決,肯定為大家省心),而且可以代碼動(dòng)態(tài)切換這兩種布局方式以及瀑布流布局。相關(guān)切換方式網(wǎng)上有很多,大家自行搜索,我就不貼連接了。

相信大家在之前使用listview時(shí)肯定一直很厭煩重復(fù)編寫無數(shù)的adapter,當(dāng)然有那么一部分機(jī)智如我的人肯定一直使用著萬能適配器。然而RecyclerView要求我們必須使用ViewHolder來實(shí)現(xiàn)adapter。這就讓許多用慣了萬能適配器的人不爽了。今天我就提供一直基于listview萬能適配器的實(shí)現(xiàn)原理來改良實(shí)現(xiàn)的RecyclerView的通用適配器,由于不是教學(xué),切代碼比較簡(jiǎn)單,就不分段講解了,相信大家看注釋就能看懂。

一共兩個(gè)類,一個(gè)是繼承了系統(tǒng)的Android.support.v7.widget.RecyclerView.ViewHolder所實(shí)現(xiàn)的RViewHolder類,通過他實(shí)現(xiàn)任意控件的緩存一個(gè)是繼承了android.support.v7.widget.RecyclerView.Adapter所實(shí)現(xiàn)的RBaseAdapter類。

實(shí)現(xiàn)代碼:

RViewHolder

import android.content.Context;import android.graphics.Bitmap;import android.support.v7.widget.RecyclerView.ViewHolder;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;public class RViewHolder extends ViewHolder { private Context mContext; private View mConvertView; private SparseArray<View> mViews; public RViewHolder(View itemView) {  super(itemView);  mConvertView = itemView;  this.mViews = new SparseArray<View>(); } public static RViewHolder get(Context context, ViewGroup parent, int layoutId, int position) {  View view = LayoutInflater.from(context).inflate(layoutId, parent, false);  return new RViewHolder(view); } /**  * 通過控件的Id獲取對(duì)于的控件,如果沒有則加入views  *   * @param viewId  * @return  */ 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; } /**  * 為TextView設(shè)置字符�?  *   * @param viewId  * @param text  * @return  */ public ViewHolder setText(int viewId, String text) {  TextView view = getView(viewId);  view.setText(text);  return this; } /**  * 為ImageView設(shè)置圖片  *   * @param viewId  * @param drawableId  * @return  */ public ViewHolder setImageResource(int viewId, int drawableId) {  ImageView view = getView(viewId);  view.setImageResource(drawableId);  return this; } /**  * 為ImageView設(shè)置圖片  *   * @param viewId  * @param drawableId  * @return  */ public ViewHolder setImageBitmap(int viewId, Bitmap bm) {  ImageView view = getView(viewId);  view.setImageBitmap(bm);  return this; } public View getConvertView() {  return mConvertView; }}

這里是RBaseAdapter

import java.util.ArrayList;import java.util.Collection;import java.util.List;import android.content.Context;import android.support.v7.widget.RecyclerView.Adapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;public abstract class RBaseAdapter<T> extends Adapter<RViewHolder> { private Context mContext; private List<T> list; protected LayoutInflater mInflater; private int mItemLayoutId; public RBaseAdapter(Context context) {  // TODO Auto-generated constructor stub  this.mContext = context;  this.mInflater = LayoutInflater.from(mContext);  this.mItemLayoutId = new LinearLayout(mContext).getId();  this.list = new ArrayList<T>(); } public RBaseAdapter(Context context, List<T> list) {  // TODO Auto-generated constructor stub  this.mContext = context;  this.mInflater = LayoutInflater.from(mContext);  this.mItemLayoutId = new LinearLayout(mContext).getId();  this.list = list; } public RBaseAdapter(Context context, List<T> list, int itemLayoutId) {  this.mContext = context;  this.mInflater = LayoutInflater.from(mContext);  this.mItemLayoutId = itemLayoutId;  this.list = list; } public RBaseAdapter(Context context, int itemLayoutId) {  this.mContext = context;  this.mInflater = LayoutInflater.from(mContext);  this.mItemLayoutId = itemLayoutId;  this.list = new ArrayList<T>(); } public void setitemLayoutId(int itemLayoutId) {  this.mItemLayoutId = itemLayoutId; } public List<T> getList() {  return this.list; } public void appendList(List<T> list) {  // TODO Auto-generated method stub  this.list = list;  notifyDataSetChanged(); } public void addList(List<T> list2) {  // TODO Auto-generated method stub  this.list.addAll((Collection<? extends T>) list2);  notifyDataSetChanged(); } @Override public int getItemCount() {  return list.size(); } boolean hasHeader = false; boolean hasFooter = false; View headerView; View footerView; public void setHeaderView(View headerView) {  hasHeader=true;  this.headerView = headerView; } public void setFooterView(View footerView) {   hasFooter = true;  this.footerView = footerView; } public View getHeaderView() {  return headerView; } public View getFooterView() {  return footerView; } @Override public void onBindViewHolder(RViewHolder holder, int position) {  if (hasHeader && position == 0) {   return;  } else if (hasFooter && position == (list.size() + (hasHeader ? 1 : 0))) {   return;  } else   convert(holder, (T) list.get(position)); } @Override public RViewHolder onCreateViewHolder(ViewGroup parent, int position) {  if (hasHeader && position == 0) {   return new RViewHolder(headerView);  } else if (hasFooter && position == (list.size() + (hasHeader ? 1 : 0))) {   return new RViewHolder(footerView);  } else   return RViewHolder.get(mContext, parent, mItemLayoutId, position); }//這里定義抽象方法,我們?cè)谀涿麅?nèi)部類實(shí)現(xiàn)的時(shí)候?qū)崿F(xiàn)此方法來調(diào)用控件 public abstract void convert(RViewHolder holder, T item);}

    對(duì)于RBaseAdapter稍微講解下,首先是泛型,這樣任何對(duì)象類型都可以使用,再來就是前面提到的headerview和footerview的解決,可以看到RBaseAdapter里面定義了幾個(gè)方法,通過position的不同來加載不同的布局的思想來添加headerview和footerview。

    Activity里面調(diào)用

recyclerView.setAdapter(new RBaseAdapter<VirtualWinsBean>(mContext, R.layout.virtual_win_users_list_item) {   @Override   public void convert(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()));   }  });

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 峡江县| 驻马店市| 武威市| 温泉县| 灵璧县| 临泉县| 全椒县| 比如县| 徐汇区| 色达县| 乌拉特后旗| 西和县| 定襄县| 昆山市| 板桥市| 汤阴县| 德清县| 泾源县| 比如县| 镇沅| 凌源市| 广水市| 佛学| 上饶市| 会东县| 满洲里市| 林芝县| 姜堰市| 临高县| 襄城县| 塔河县| 西贡区| 佛坪县| 崇礼县| 东乡| 根河市| 全椒县| 扶余县| 中方县| 津南区| 临高县|