日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android适配器以及作用,Android RecyclerView 通用适配器的实现

發(fā)布時間:2025/3/21 Android 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android适配器以及作用,Android RecyclerView 通用适配器的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分析

我們需要在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ù)集合進(jìn)行賦值

/**

* 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è)置方法,采用鏈?zhǔn)秸{(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。