Android适配器以及作用,Android RecyclerView 通用适配器的实现
分析
我們需要在RecyclerViewAdapter內(nèi)部維持一個數(shù)據(jù)集合的引用
需要實現(xiàn)Item的點擊事件,包括短按和長按,并需要向外部提供設(shè)置監(jiān)聽器的方法
這個適配器必須通用,所以應(yīng)該是泛型的,并且ViewHolder也是通用的,可以采用SparseArray維持View的所有集合
在RecyclerViewAdapter內(nèi)部需要實現(xiàn)數(shù)據(jù)的綁定(抽象方法,延遲到子類實現(xiàn)),監(jiān)聽器的綁定
編寫監(jiān)聽器
分為短按事件和長按事件
短按監(jiān)聽器
package cn.edu.zafu.base.adapter.listener;
import android.view.View;
/**
* Created by lizhangqu on 2015/6/3.
*/
public interface OnItemClickListener {
void onClick(View view, T item);
}
長按監(jiān)聽器
package cn.edu.zafu.base.adapter.listener;
import android.view.View;
/**
* Created by lizhangqu on 2015/6/3.
*/
public interface OnItemLongClickListener {
void onLongClick(View view, T item);
}
編寫通用適配器
設(shè)置監(jiān)聽器
package cn.edu.zafu.base.adapter;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import cn.edu.zafu.base.adapter.listener.OnItemClickListener;
import cn.edu.zafu.base.adapter.listener.OnItemLongClickListener;
/**
* this is a BaseAdapter for RecyclerView
* author lizhangqu
* version 1.0
* date 2015/6/3.
*/
public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter {
/**
* click listener
*/
protected OnItemClickListener mOnItemClickListener;
/**
* long click listener
*/
protected OnItemLongClickListener mOnItemLongClickListener;
/**
* set a long click listener
*
* @param onItemLongClickListener
*/
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
mOnItemLongClickListener = onItemLongClickListener;
}
/**
* set a click listener
*
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
}
編寫構(gòu)造方法,將數(shù)據(jù)集合進行賦值
/**
* data
*/
protected List mList;
/**
* @param list the datas to attach the adapter
*/
public BaseRecyclerViewAdapter(List list) {
mList = list;
}
實現(xiàn)幾個必要的方法,比如獲得Item以及覆寫getItemCount方法
/**
* get a item by index
*
* @param position
* @return
*/
protected T getItem(int position) {
return mList.get(position);
}
@Override
public int getItemCount() {
return mList.size();
}
實現(xiàn)將布局文件映射成View的方法
/**
* inflate a view by viewgroup ,id ,etc
*
* @param viewGroup
* @param layoutId
* @return
*/
protected View inflateItemView(ViewGroup viewGroup, int layoutId) {
return inflateItemView(viewGroup, layoutId, false);
}
/**
* inflate a view by viewgroup ,id ,etc
*
* @param viewGroup
* @param layoutId
* @param attach
* @return
*/
protected View inflateItemView(ViewGroup viewGroup, int layoutId, boolean attach) {
return LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, attach);
}
實現(xiàn)onBindViewHolder方法,這一步很重要,將具體實現(xiàn)抽取到兩個方法中去實現(xiàn),bindDataToItemView是一個抽象方法,延遲到子類實現(xiàn),bindItemViewClickListener方法設(shè)置監(jiān)聽器
/**
* a final function to avoid you override
* use template design pattern
*
* @param vh
* @param position
*/
@Override
public final void onBindViewHolder(VH vh, int position) {
final T item = getItem(position);
bindDataToItemView(vh, item);
bindItemViewClickListener(vh, item);
}
/**
* bind data to itemview
*
* @param vh viewholder
* @param item item
*/
protected abstract void bindDataToItemView(VH vh, T item);
/**
* bind click listner to itemview
*
* @param vh viewholder
* @param item item
*/
protected final void bindItemViewClickListener(VH vh, final T item) {
if (mOnItemClickListener != null) {
vh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnItemClickListener.onClick(view, item);
}
});
}
if (mOnItemLongClickListener != null) {
vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemLongClickListener.onLongClick(v, item);
return true;
}
});
}
}
實現(xiàn)通用ViewHolder,內(nèi)部使用SparseArray維持View對象
public static class SparseArrayViewHolder extends RecyclerView.ViewHolder {
private final SparseArray views;
public SparseArrayViewHolder(View itemView) {
super(itemView);
views = new SparseArray();
}
public T getView(int id) {
View view = views.get(id);
if (view == null) {
view = itemView.findViewById(id);
views.put(id, view);
}
return (T) view;
}
}
內(nèi)部實現(xiàn)了一個泛型的getView方法,其作用就是將View緩存至SparseArray中去
實現(xiàn)通用ViewHolder的一些屬性設(shè)置方法,采用鏈式調(diào)用,返回this對象
public SparseArrayViewHolder setText(int viewId, String value) {
TextView view = getView(viewId);
view.setText(value);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setTextColor(int viewId, int textColor) {
TextView view = getView(viewId);
view.setTextColor(textColor);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setImageResource(int viewId, int imageResId) {
ImageView view = getView(viewId);
view.setImageResource(imageResId);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setBackgroundColor(int viewId, int color) {
View view = getView(viewId);
view.setBackgroundColor(color);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setBackgroundResource(int viewId, int backgroundRes) {
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setVisible(int viewId, boolean visible) {
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
View view = getView(viewId);
view.setOnClickListener(listener);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
View view = getView(viewId);
view.setOnTouchListener(listener);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
View view = getView(viewId);
view.setOnLongClickListener(listener);
return SparseArrayViewHolder.this;
}
public SparseArrayViewHolder setTag(int viewId, Object tag) {
View view = getView(viewId);
view.setTag(tag);
return SparseArrayViewHolder.this;
}
源碼
總結(jié)
以上是生活随笔為你收集整理的Android适配器以及作用,Android RecyclerView 通用适配器的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言系统主函数流程图,C语言程序设计—
- 下一篇: android子view获取父布局,An