Android RecyclerView Adapter及Holder的封裝【原創】
阿新 • • 發佈:2019-01-07
專案中使用到了橫向的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部落格 ,轉載時請註明出處及相應連結。