1. 程式人生 > >Android RecyclerView Adapter及Holder的封裝【原創】

Android RecyclerView Adapter及Holder的封裝【原創】

專案中使用到了橫向的ListView樣子的功能,一開始使用Gallery做,由於Gallery的自帶彈性功能,效果不理想,於是使用網上的一些開源的橫向ListView,但是效果很卡,

最後使用了v7包中的RecyclerView,初次使用,不太熟練,對其進行了簡單的封裝

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 package cn.zmit.sujiamart.adapter.base; import java.util.ArrayList; import java.util.List; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase; /** * 橫向RecyclerView基類adapter * @author Robin
* time 2015-04-10 12:33:43 * * @param <ItemDataType> 資料實體型別 */ public abstract class HorizontalRecyclerViewBaseAdapter<ItemDataType> extends RecyclerView.Adapter<RecyclerViewHolderBase> { protected ArrayList<ItemDataType> mItemDataList = new ArrayList<ItemDataType>(); public
HorizontalRecyclerViewBaseAdapter(){ } /** * 動態增加一條資料 * @param itemDataType 資料實體類物件 */ public void append(ItemDataType itemDataType){ if (itemDataType!=null) { mItemDataList.add(itemDataType); notifyDataSetChanged(); } } /** * 動態增加一組資料集合 * @param itemDataTypes 資料實體類集合 */ public void append(List<ItemDataType> itemDataTypes){ if (itemDataTypes.size()>0) { for (ItemDataType itemDataType : itemDataTypes) { mItemDataList.add(itemDataType); } notifyDataSetChanged(); } } /** * 替換全部資料 * @param itemDataTypes 資料實體類集合 */ public void replace(List<ItemDataType> itemDataTypes){ mItemDataList.clear(); if (itemDataTypes.size()>0) { mItemDataList.addAll(itemDataTypes); notifyDataSetChanged(); } } /** * 移除一條資料集合 * @param position */ public void remove(int position){ mItemDataList.remove(position); notifyDataSetChanged(); } /** * 移除所有資料 */ public void removeAll(){ mItemDataList.clear(); notifyDataSetChanged(); } @Override public int getItemCount() { return mItemDataList.size(); } @Override public void onBindViewHolder(RecyclerViewHolderBase viewHolder, int i) { showData(viewHolder, i, mItemDataList); } @Override public RecyclerViewHolderBase onCreateViewHolder(ViewGroup viewGroup, int i) { View view=createView(viewGroup, i); RecyclerViewHolderBase holder = createViewHolder(view); return holder; } /*public static class ViewHolder extends RecyclerView.ViewHolder { private ImageView img_product; private TextView tv_title; public ViewHolder(View itemView) { super(itemView); img_product=(ImageView) itemView.findViewById(R.id.img_product); tv_title=(TextView) itemView.findViewById(R.id.tv_title); } }*/ /** * 顯示資料抽象函式 * @param viewHolder 基類ViewHolder,需要向下轉型為對應的ViewHolder(example:MainRecyclerViewHolder mainRecyclerViewHolder=(MainRecyclerViewHolder) viewHolder;) * @param i 位置 * @param mItemDataList 資料集合 */ public abstract void showData(RecyclerViewHolderBase viewHolder, int i,List<ItemDataType> mItemDataList ); /** * 載入item的view,直接返回載入的view即可 * @param viewGroup 如果需要Context,可以viewGroup.getContext()獲取 * @param i * @return item 的 view */ public abstract View  createView(ViewGroup viewGroup, int i) ; /** * 載入一個ViewHolder,為RecyclerViewHolderBase子類,直接返回子類的物件即可 * @param view item 的view * @return  RecyclerViewHolderBase 基類ViewHolder */ public abstract RecyclerViewHolderBase  createViewHolder(View view) ; }

上面是基類,如果需要多個不同的橫向RecyclerView,可以繼承上面的基類

下面是一個Example:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 package cn.zmit.sujiamart.adapter; import java.util.List; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import cn.zmit.sujiamart.R; import cn.zmit.sujiamart.adapter.base.HorizontalRecyclerViewBaseAdapter; import cn.zmit.sujiamart.constants.Url; import cn.zmit.sujiamart.entity.ProductsEntity; import cn.zmit.sujiamart.holder.MainHorizontalRecyclerViewHolder; import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase; import cn.zmit.sujiamart.image.ImageDisplayer; import cn.zmit.sujiamart.ui.activity.ProductDetailsActivity; /** * 主頁橫向RecyclerView的介面卡 * @author Robin * time 2015-04-10 12:50:31 * */ public class MainHorizontalRecyclerViewAdapter extends HorizontalRecyclerViewBaseAdapter<ProductsEntity> { private Context context; public MainHorizontalRecyclerViewAdapter(){ } @Override public void showData(RecyclerViewHolderBase viewHolder, final int i, final List<ProductsEntity> mItemDataList) { //向下轉型為子類 MainHorizontalRecyclerViewHolder mainRecyclerViewHolder=(MainHorizontalRecyclerViewHolder) viewHolder; //為控制元件賦值 ImageDisplayer.getInstance().dispalyImageWithRadius(Url.IMAGE_URL_ROOT+mItemDataList.get(i).getImage(), mainRecyclerViewHolder.img_product); mainRecyclerViewHolder.tv_title.setText(mItemDataList.get(i).getName()); mainRecyclerViewHolder.tv_price.setText(mItemDataList.get(i).getPrice()); mainRecyclerViewHolder.tv_old_price.setText("¥"+mItemDataList.get(i).getPrice_special()); mainRecyclerViewHolder.mRootRelativeLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(context, ProductDetailsActivity.class); Bundle bundle=new Bundle(); bundle.putString("productId", mItemDataList.get(i).getProduct_id()); intent.putExtras(bundle); context.startActivity(intent); } }); } @Override public View createView(ViewGroup viewGroup, int i) { context=viewGroup.getContext(); //載入item的佈局 View view=View.inflate(context,R.layout.item_main_horizontal_listview, null); return view; } @Override public RecyclerViewHolderBase createViewHolder(View view) { //直接返回viewholder物件 return new MainHorizontalRecyclerViewHolder(view); } }

RycycleView需要一個ViewHolder,這裡也對ViewHolder進行了簡單封裝,下面是ViewHolder的基類

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package cn.zmit.sujiamart.holder.base; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.View; /** * RecyclerViewHolder基類 * @author Robin *time 2015-04-10 11:43:49 */ public abstract class RecyclerViewHolderBase extends ViewHolder { public RecyclerViewHolderBase(View itemView) { super(itemView); } }

如上Adapter需要對應一個ViewHolder,只需要繼承上面的Viewholder基類,即可。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package cn.zmit.sujiamart.holder; import android.graphics.Paint; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import cn.zmit.sujiamart.R; import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase; /** * 主頁橫向RecyclerView的viewholder * @author Robin * time 2015-04-10 12:53:02 * */ public class MainHorizontalRecyclerViewHolder extends RecyclerViewHolderBase { public ImageView img_product; public TextView tv_title; public TextView tv_price; public TextView tv_old_price; public RelativeLayout mRootRelativeLayout; /** * 在建構函式中進行findviewbyid * @param itemView item的view */ public MainHorizontalRecyclerViewHolder(View itemView) { super(itemView); img_product=(ImageView) itemView.findViewById(R.id.img_product); tv_title=(TextView) itemView.findViewById(R.id.tv_title); tv_price=(TextView) itemView.findViewById(R.id.tv_price); tv_old_price=(TextView) itemView.findViewById(R.id.tv_old_price); tv_old_price.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);  //設定中劃線加清晰 mRootRelativeLayout=(RelativeLayout) itemView.findViewById(R.id.rl_root); } }

本文永久地址:http://blog.it985.com/10387.html
本文出自 IT985部落格 ,轉載時請註明出處及相應連結。