Android 中RecyclerView通用適配器的實現(xiàn)
Android 中RecyclerView通用適配器的實現(xiàn)
前言:
SDK的5.0版本出來已經(jīng)N久了,可以說是已經(jīng)經(jīng)過許多人的檢驗了,里面的新控件不能說是非常完美,但也是非常好用了,其中最讓我喜愛的就是RecyclerView了,可以完美替代ListView和GridView(除了添加headerview和footview了,網(wǎng)上有許多解決方式。這個下面會以一種簡單的方式順帶解決,肯定為大家省心),而且可以代碼動態(tài)切換這兩種布局方式以及瀑布流布局。相關(guān)切換方式網(wǎng)上有很多,大家自行搜索,我就不貼連接了。
相信大家在之前使用listview時肯定一直很厭煩重復(fù)編寫無數(shù)的adapter,當然有那么一部分機智如我的人肯定一直使用著萬能適配器。然而RecyclerView要求我們必須使用ViewHolder來實現(xiàn)adapter。這就讓許多用慣了萬能適配器的人不爽了。今天我就提供一直基于listview萬能適配器的實現(xiàn)原理來改良實現(xiàn)的RecyclerView的通用適配器,由于不是教學(xué),切代碼比較簡單,就不分段講解了,相信大家看注釋就能看懂。
一共兩個類,一個是繼承了系統(tǒng)的Android.support.v7.widget.RecyclerView.ViewHolder所實現(xiàn)的RViewHolder類,通過他實現(xiàn)任意控件的緩存一個是繼承了android.support.v7.widget.RecyclerView.Adapter所實現(xiàn)的RBaseAdapter類。
實現(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獲取對于的控件,如果沒有則加入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);
}
//這里定義抽象方法,我們在匿名內(nèi)部類實現(xiàn)的時候?qū)崿F(xiàn)此方法來調(diào)用控件
public abstract void convert(RViewHolder holder, T item);
}
對于RBaseAdapter稍微講解下,首先是泛型,這樣任何對象類型都可以使用,再來就是前面提到的headerview和footerview的解決,可以看到RBaseAdapter里面定義了幾個方法,通過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()));
}
});
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 淺談Android中適配器的notifyDataSetChanged()為何有時不刷新
- Android之自定義實現(xiàn)BaseAdapter(通用適配器三)
- Android ListView和Adapter數(shù)據(jù)適配器的簡單介紹
- 詳解xamarin Android 實現(xiàn)ListView萬能適配器
- Kotlin編寫Android適配器Adapter
- Android SimpleAdapter適配器使用詳解
- Android 通過ViewHolder優(yōu)化適配器的實現(xiàn)方法(必看)
- Android ListView適配器(Adapter)優(yōu)化方法詳解
- RecyclerView實現(xiàn)橫向滾動效果
- Android RecyclerView網(wǎng)格布局示例解析
- Android實現(xiàn)的RecyclerView適配器
相關(guān)文章
Android開發(fā)之開發(fā)者頭條APP(三)實現(xiàn)首頁
這篇文章主要介紹了Android開發(fā)之開發(fā)者頭條APP(三)實現(xiàn)首頁的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟
這篇文章主要介紹了Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Android?IntentFilter的匹配規(guī)則示例詳解
這篇文章主要為大家介紹了Android?IntentFilter的匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android Room數(shù)據(jù)庫多表查詢的使用實例
這篇文章主要介紹了Android Room數(shù)據(jù)庫多表查詢的使用實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

