您的位置:首页 > 其它

RecyclerView万能适配器(多布局、header、footer)

2017-10-24 17:36 911 查看


看到这种界面,能想到的就是做一个RecyclerView万能适配器。

万能适配需要做 头部、尾部、多布局。

首先制作3个RecyclerView:

1.VerticalRecyclerView:

public class VerticalRecyclerView extends RecyclerView {
public VerticalRecyclerView(Context context) {
this(context, null);
}

public VerticalRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setOverScrollMode(OVER_SCROLL_NEVER);
}

@Override
public void setAdapter(Adapter adapter) {
super.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
setLayoutManager(linearLayoutManager);
}

}


2.HorizontalRecyclerView :

public class HorizontalRecyclerView extends RecyclerView {
public HorizontalRecyclerView(Context context) {
this(context, null);
}

public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setOverScrollMode(OVER_SCROLL_NEVER);

}

@Override
public void setAdapter(Adapter adapter) {
super.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
setLayoutManager(linearLayoutManager);
}
}


3.GridRecyclerView:

public class GridRecyclerView extends RecyclerView {
private Context context;
public GridRecyclerView(Context context) {
this(context, null);
}

public GridRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.context=context;
setOverScrollMode(OVER_SCROLL_NEVER);

}
public void setAdapter(Adapter adapter, int spanCount,int orientation) {
LayoutManager layoutManager = new StaggeredGridLayoutManager(spanCount, orientation);
setLayoutManager(layoutManager);
setAdapter(adapter);

}
public void setAdapterAddHead( Adapter adapter, int spanCount,int orientation){
setAdapter(adapter);

//初始化布局管理器
final GridLayoutManager lm = new GridLayoutManager(context,spanCount,orientation,false);

/*
*设置SpanSizeLookup,它将决定view会横跨多少列。这个方法是为RecyclerView添加Header和Footer的关键。
*当判断position指向的View为Header或者Footer时候,返回总列数( lm.getSpanCount()),即可让其独占一行。
*/

lm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position==0? lm.getSpanCount():1;
}
});

//设置布局管理器
setLayoutManager(lm);
}

}


万能适配器:

public abstract class RVAdapter<T> extends RecyclerView.Adapter<RVAdapter.MyViewHolder> {
private List<T> list_bean;//数据
private boolean haveHeadView = false;//是否需要头部
private boolean haveFootView = false;//是否需要尾部
private int selectedPosition = 0; //默认选中位置
private int lastSelectedPosition = 0; //上次选中位置

//带headview或者选中效果的
public RVAdapter(List<T> list_bean, boolean haveHeadView) {
this.list_bean = list_bean;
this.haveHeadView = haveHeadView;
if (haveHeadView) {
selectedPosition = 1;
lastSelectedPosition = 1;
}
}

public RVAdapter(List<T> list_bean, boolean haveHeadView, boolean haveFootView) {
this.haveFootView = haveFootView;
this.haveHeadView = haveHeadView;
this.list_bean = list_bean;
if (haveHeadView) {
selectedPosition = 1;
lastSelectedPosition = 1;
}
}

//普通的
public RVAdapter(List<T> list) {
this.list_bean = list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据viewType选择布局,实现多布局
return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(getItemLayoutID(viewType), parent, false));
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
//添加Item的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (haveHeadView) {
if (position == 0) {
onItemHeadClick();
return;
}
if (haveFootView) {
if (position == getItemCount() - 1) {
onItemFootClick();
return;
}
}

} else {
if (haveFootView) {
if (position == getItemCount() - 1) {
onItemFootClick();
return;
}
}
}
if (haveHeadView){

onItemClick(position,list_bean.get(position-1));
}else {
onItemClick(position,list_bean.get(position));

}

if (lastSelectedPosition == position) {
return;
}
selectedPosition = position; //选择的position赋值给参数,
notifyItemChanged(selectedPosition);
notifyItemChanged(lastSelectedPosition);

lastSelectedPosition = position;

}
});
//长按事件
//        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
//            @Override
//            public boolean onLongClick(View v) {
//                if (position == 0) {
//                    onItemHeadLongClick();
//                } else {
//                    if (position == getItemCount() - 1) {
//                        onItemFootLongClick();
//                    } else {
//
//                        onItemLongClick(position);
//                    }
//
//                }
//                return false;
//            }
//        });
//有头部
if (haveHeadView) {
if (position == 0) {
if (list_bean.size()>0){

bindDataToHeadVie
149a9
w(holder);
}
return;
}
if (haveFootView) {
if (position == getItemCount() - 1) {
bindDataToFootView(holder);
return;
}
}
if (position == selectedPosition) {
bindDataToView(holder, position - 1,list_bean.get(position-1), true);

} else {
bindDataToView(holder, position - 1, list_bean.get(position-1),false);

}

} else {
if (haveFootView) {
if (position == getItemCount() - 1) {
bindDataToFootView(holder);
return;
}
}
if (position == selectedPosition) {
bindDataToView(holder, position,list_bean.get(position), true);

} else {
bindDataToView(holder, position,list_bean.get(position), false);

}
}

}

//填充数据
public abstract void bindDataToView(MyViewHolder holder, int position,T bean, boolean isSelected);

//添加头部
public void bindDataToHeadView(MyViewHolder holder) {
}

//添加尾部
public void bindDataToFootView(MyViewHolder holder) {
}

@Override
public int getItemCount() {
if (haveHeadView) {
if (haveFootView) {
return list_bean.size() + 2;

}
return list_bean.size() + 1;
}
if (haveFootView) {
return list_bean.size() + 1;
}

return list_bean.size();
}

/*
取得ItemView的布局文件
@return
*/
public abstract int getItemLayoutID(int viewType);

@Override
public abstract int getItemViewType(int position);

/*
ItemView的单击事件

@param position
*/

public abstract void onItemClick(int position,T bean);

public void onItemHeadClick() {
}

public void onItemFootClick() {
}

public void onItemLongClick(int position) {
}

public void onItemHeadLongClick() {
}

public void onItemFootLongClick() {
}

public void remove(int position){
list_bean.remove(position);
notifyDataSetChanged();
}
public void add(T bean) {
list_bean.add(bean);
notifyDataSetChanged();
}
public void addNoNotify(T bean) {
list_bean.add(bean);
}

public void addToHead(T bean) {
list_bean.add(0, bean);
notifyDataSetChanged();
}

public int addAll(List<T> beans) {
list_bean.addAll(beans);

notifyDataSetChanged();
return beans.size();
}
public void addAll(Collection<T> c){
list_bean.addAll(c);
notifyDataSetChanged();

}

public void clearAddAll(List<T> beans) {
list_bean.clear();
list_bean.addAll(beans);
notifyDataSetChanged();
}

public void addAllToHead(List<T> beans) {
list_bean.addAll(0, beans);
notifyDataSetChanged();
}

public void clear() {
list_bean.clear();
notifyDataSetChanged();
}

public static class MyViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> array_view;

public MyViewHolder(View itemView) {
super(itemView);

array_view = new SparseArray<View>();

}

public <T extends View> T getView(int viewId) {

View view = array_view.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
array_view.put(viewId, view);
}
return (T) view;
}

public MyViewHolder setVisible(int res_id) {
getView(res_id).setVisibility(View.VISIBLE);
return this;
}
public MyViewHolder setInVisible(int res_id) {
getView(res_id).setVisibility(View.INVISIBLE);
return this;
}

public void setViewGone(int res_id) {
getView(res_id).setVisibility(View.GONE);
}
public void setViewVisible(int res_id) {
getView(res_id).setVisibility(View.VISIBLE);
}

public void setText(int tv_id, String text) {
TextView tv = getView(tv_id);

tv.setText(text);
}
public void setPriceText(int tv_id, String text) {
TextView tv = getView(tv_id);

tv.setText("¥"+text);
}
public void setCountText(int tv_id, String text) {
TextView tv = getView(tv_id);

tv.setText("x"+text);
}
public void setCountText(int tv_id, int text) {
TextView tv = getView(tv_id);

tv.setText("x"+text);
}
public void setPriceText(int tv_id, int text) {
TextView tv = getView(tv_id);

tv.setText("¥"+text);
}
public void setPriceText(int tv_id, float text) {
TextView tv = getView(tv_id);

tv.setText("¥"+text);
}

public void setText(int tv_id, int text) {
TextView tv = getView(tv_id);
tv.setText(String.valueOf(text));
}

public void setTextColor(int tv_id, int color) {
TextView tv = getView(tv_id);
tv.setTextColor(color);
}
public String getTVText(int tv_id) {
TextView tv = getView(tv_id);
return tv.getText().toString().trim();
}
public String getETText(int tv_id) {
EditText tv = getView(tv_id);
return tv.getText().toString().trim();
}

public void setBackgroundResource(int v_id, int resid) {
View view = getView(v_id);
view.setBackgroundResource(resid);
}

public void setImage(Context context, int iv_id, String url, int width,int height,int default_res) {
ImageView iv = getView(iv_id);

GlideUtils.loadImageByGlide(context, url, iv, width,height);
}
public void setImage(Context context, int iv_id, String url,int default_res) {
ImageView iv = getView(iv_id);

GlideUtils.loadImageByGlide(context, url, iv);
}
public void setImage(Context context, int iv_id, String url, int width,int height) {
ImageView iv = getView(iv_id);

GlideUtils.loadImageByGlide(context, url, iv, width,height);
}
public void setProgress( int progress_id,int progress) {
ProgressBar progressBar=getView(progress_id);
progressBar.setProgress(progress);

}

public void setOnClickListener(int res_id, View.OnClickListener onClickListener) {
getView(res_id).setOnClickListener(onClickListener);
}

public void setOnLongClickListener(int res_id, View.OnLongClickListener onLongClickListener) {
getView(res_id).setOnLongClickListener(onLongClickListener);
}

}

}


使用方法:

rvAdapter = new RVAdapter<ActiveBean.ListBean.GoodsModuleBean>(list_bean, true) {
@Override
public void bindDataToHeadView(MyViewHolder holder) {
super.bindDataToHeadView(holder);
if (activeScekillBean==null){
return;
}
ActiveScekillBean.ActivityBean activityBean = activeScekillBean.getActivity();

holder.getView(layout_miaosha).setOnClickListener(ActiveAreaFragment.this);
tv_miaosha_changci = holder.getView(R.id.tv_miaosha_changci);
tv_time = holder.getView(R.id.tv_time);
end_time = activityBean.getEnd_time();
if (Long.valueOf(end_time) - TimeAndAgeUtils.getCureentTimeStampLong() > 0l) {
tv_miaosha_changci.setText(TimeAndAgeUtils.timeStamp2DateHour(activityBean.getStart_time()) + "点场  ");

tv_time.setText(TimeAndAgeUtils.getDistance2CurrentTimeStamp(end_time));
new Thread(new Runnable() {
@Override
public void run() {
if (!isRunning) {
return;
}
while (Long.valueOf(end_time) - TimeAndAgeUtils.getCureentTimeStampLong() > 0l) {

try {
Thread.sleep(1000);
handler.sendEmptyMessage(0);

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}

final List<ActiveScekillBean.GoodsBean> list_goods = (List<ActiveScekillBean.GoodsBean>) activeScekillBean.getGoods();

RVAdapter<ActiveScekillBean.GoodsBean> rvAdapter_miaosha = new RVAdapter<ActiveScekillBean.GoodsBean>(list_goods) {
@Override
public void bindDataToView(MyViewHolder holder, int position, ActiveScekillBean.GoodsBean bean, boolean isSelected) {
ActiveScekillBean.GoodsBean goodsBean = list_goods.get(position);
holder.setImage(getContext(), R.id.iv_logo, goodsBean.getLogo(), 300, 300);
holder.setText(R.id.tv_name, goodsBean.getTitle());
holder.setText(R.id.tv_price, "¥" +goodsBean.getPrice());
holder.setText(R.id.tv_price_yuanlai, "¥"+goodsBean.getLimit_price());
}

@Override
public int getItemLayoutID(int viewType) {
return R.layout.item_fragment_active_miaosha;
}

@Override
public int getItemViewType(int position) {
return 0;
}

@Override
public void onItemClick(int position, ActiveScekillBean.GoodsBean bean) {

}
};
((HorizontalRecyclerView) holder.getView(R.id.hrv_miaosha)).setAdapter(rvAdapter_miaosha);
}

@Override
public void bindDataToView(MyViewHolder holder, int position, ActiveBean.ListBean.GoodsModuleBean bean, boolean isSelected) {

ActiveBean.ListBean.GoodsModuleBean goodsModuleBean = list_bean.get(position);
holder.setImage(getContext(), R.id.iv_banner, goodsModuleBean.getBanner().getLogo(), 300, 300);

HorizontalRecyclerView hrv_center_inner = (HorizontalRecyclerView) holder.getView(R.id.hrv);
final List<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX> list_goods = goodsModuleBean.getGoods();
RVAdapter<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX> rvAdapter_center_inner =
new RVAdapter<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX>(list_goods) {
@Override
public void bindDataToView(MyViewHolder holder, int position, ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX bean, boolean isSelected) {
ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX goodsBeanX = list_goods.get(position);
holder.setImage(getContext(), R.id.iv_logo, goodsBeanX.getLogo(), 300, 300);
holder.setText(R.id.tv_name, goodsBeanX.getTitle());
holder.setText(R.id.tv_price, "¥" + goodsBeanX.getPrice());
}

@Override
public int getItemLayoutID(int viewType) {
return R.layout.item_fragment_active_center_inner_hrv;
}

@Override
public int getItemViewType(int position) {
return 0;
}

@Override
public void onItemClick(int position, ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX bean) {
Intent  intent=new Intent(getContext(),GoodsDetailActivity.class);
LogUtils.log("pos_id",list_goods.get(position).getId());
intent.putExtra(Constant.INTENT_GOODS_DETAIL_ACTIVITY,list_goods.get(position).getId());
//                                intent.putExtra(Constant.INTENT_GOODS_DETAIL_ACTIVITY,"1");
//                                startActivityForResult(intent,Constant.REQUEST_2_GOODS_DETAIL_ACTIVITY);
startActivity(intent);
}

};
hrv_center_inner.setAdapter(rvAdapter_center_inner);
}

@Override
public int getItemLayoutID(int viewType) {
if (viewType == 0) {
return R.layout.include_fragment_active_miaosha;
}
return R.layout.item_fragment_active_center;
}

@Override
public int getItemViewType(int position) {
if (position == 0) {
return 0;
}
return 1;
}

@Override
public void onItemClick(int position, ActiveBean.ListBean.GoodsModuleBean bean) {

}
};


参考:ListView、RecyclerView、GridView
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐