欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年03月27日 16:05:50   投稿:lqh  
這篇文章主要介紹了Android 中RecyclerView通用適配器的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

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

前言:

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

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

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

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

 /**
  * 通過(guò)控件的Id獲取對(duì)于的控件,如果沒(méi)有則加入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;
 }

 /**
  * 為T(mén)extView設(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)部類(lèi)實(shí)現(xiàn)的時(shí)候?qū)崿F(xiàn)此方法來(lái)調(diào)用控件
 public abstract void convert(RViewHolder holder, T item);
}

    對(duì)于RBaseAdapter稍微講解下,首先是泛型,這樣任何對(duì)象類(lèi)型都可以使用,再來(lái)就是前面提到的headerview和footerview的解決,可以看到RBaseAdapter里面定義了幾個(gè)方法,通過(guò)position的不同來(lái)加載不同的布局的思想來(lái)添加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ì)本站的支持!

相關(guān)文章

  • Android開(kāi)發(fā)之開(kāi)發(fā)者頭條APP(三)實(shí)現(xiàn)首頁(yè)

    Android開(kāi)發(fā)之開(kāi)發(fā)者頭條APP(三)實(shí)現(xiàn)首頁(yè)

    這篇文章主要介紹了Android開(kāi)發(fā)之開(kāi)發(fā)者頭條APP(三)實(shí)現(xiàn)首頁(yè)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Android實(shí)現(xiàn)垂直跑馬燈效果

    Android實(shí)現(xiàn)垂直跑馬燈效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)垂直跑馬燈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android自定義控件橫向柱狀統(tǒng)計(jì)圖

    Android自定義控件橫向柱狀統(tǒng)計(jì)圖

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件橫向柱狀統(tǒng)計(jì)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 獲取Android系統(tǒng)唯一識(shí)別碼的方法

    獲取Android系統(tǒng)唯一識(shí)別碼的方法

    這篇文章主要介紹了獲取Android系統(tǒng)唯一識(shí)別碼的方法,涉及通過(guò)編程獲取Android系統(tǒng)硬件設(shè)備標(biāo)識(shí)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟

    Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟

    這篇文章主要介紹了Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Android 屬性動(dòng)畫(huà)原理與DataBinding

    Android 屬性動(dòng)畫(huà)原理與DataBinding

    這篇文章主要介紹了Android 屬性動(dòng)畫(huà)原理與DataBinding的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android自定義彈窗提示效果

    Android自定義彈窗提示效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義彈窗提示效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android使用MobSDK短信驗(yàn)證

    Android使用MobSDK短信驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了Android使用MobSDK短信驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android?IntentFilter的匹配規(guī)則示例詳解

    Android?IntentFilter的匹配規(guī)則示例詳解

    這篇文章主要為大家介紹了Android?IntentFilter的匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android Room數(shù)據(jù)庫(kù)多表查詢(xún)的使用實(shí)例

    Android Room數(shù)據(jù)庫(kù)多表查詢(xún)的使用實(shí)例

    這篇文章主要介紹了Android Room數(shù)據(jù)庫(kù)多表查詢(xún)的使用實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論