打造RecycleView 通用适配器
来源:互联网 发布:淘宝网商城衣服女装 编辑:程序博客网 时间:2024/06/05 16:59
1.创建RVIewHolder类
import android.content.Context;import android.graphics.Bitmap;import android.support.v7.widget.RecyclerView.ViewHolder;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;public class RViewHolder extends ViewHolder { private Context mContext; private View mConvertView; private SparseArray<View> mViews; public RViewHolder(View itemView) { super(itemView); mConvertView = itemView; this.mViews = new SparseArray<View>(); } public static RViewHolder get(Context context, ViewGroup parent, int layoutId, int position) { View view = LayoutInflater.from(context).inflate(layoutId, parent, false); return new RViewHolder(view); } /** * 通过控件的Id获取对于的控件,如果没有则加入views * @param viewId * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } /** * 为TextView设置字符�? * @param viewId * @param text * @return */ public ViewHolder setText(int viewId, String text) { TextView view = getView(viewId); view.setText(text); return this; } /** * 为ImageView设置图片 * @param viewId * @param drawableId * @return */ public ViewHolder setImageResource(int viewId, int drawableId) { ImageView view = getView(viewId); view.setImageResource(drawableId); return this; } /** * 为ImageView设置图片 * @param viewId * @return */ public ViewHolder setImageBitmap(int viewId, Bitmap bm) { ImageView view = getView(viewId); view.setImageBitmap(bm); return this; } public View getConvertView() { return mConvertView; }}
2.创建公共适配器Adapter
import java.util.ArrayList;import java.util.Collection;import java.util.List;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.Adapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.TextView;public abstract class RVCommonAdapter<T> extends Adapter<RViewHolder> { private Context mContext; private List<T> list; protected LayoutInflater mInflater; private int mItemLayoutId; private static final int TYPE_ITEM = 0; private static final int TYPE_FOOTER = 1; public static final int PULL_TO_LOAD_MORE = 0; public static final int LOADING = 1; public static final int NO_MORE = 2; private int mFooterStatus = PULL_TO_LOAD_MORE; public RVCommonAdapter(Context context, List<T> list, int itemLayoutId) { this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mItemLayoutId = itemLayoutId; this.list = list; } public interface OnItemClickListener { void onItemClick(View view, int position); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setitemLayoutId(int itemLayoutId) { this.mItemLayoutId = itemLayoutId; } public List<T> getList() { return this.list; } @Override public int getItemCount() { return list.size(); } @Override public int getItemViewType(int position) { if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } @Override public void onBindViewHolder(final RViewHolder holder, int position) { if (holder instanceof FootViewHolder) { bindFooter((FootViewHolder) holder); } else convert(holder, (T) list.get(position)); if (onItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = holder.getLayoutPosition(); onItemClickListener.onItemClick(holder.itemView, position); } }); } } protected void bindFooter(FootViewHolder holder) { switch (mFooterStatus){ case PULL_TO_LOAD_MORE: holder.progressBar.setVisibility(View.VISIBLE); holder.tvLoad.setText( "上拉加载更多..."); break; case LOADING: holder.progressBar.setVisibility(View.VISIBLE); holder.tvLoad.setText( "正在拼命加载..."); break; case NO_MORE: holder.tvLoad.setText("没有更多了!"); holder.progressBar.setVisibility(View.INVISIBLE); break; } } public void setFooterStatus(int status){ mFooterStatus=status; notifyDataSetChanged(); } public int getFooterStatus(){ return mFooterStatus; } @Override public RViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_ITEM) { return RViewHolder.get(mContext, parent, mItemLayoutId, viewType); } else if (viewType == TYPE_FOOTER) { return new FootViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_foot, parent, false)); }else{ return new RViewHolder(headerView); } } static class FootViewHolder extends RViewHolder { TextView tvLoad; ProgressBar progressBar; public FootViewHolder(View view) { super(view); tvLoad = (TextView)view.findViewById(R.id.tv_load); progressBar = (ProgressBar) view.findViewById(R.id.progressBar); } } //这里定义抽象方法,我们在匿名内部类实现的时候实现此方法来调用控件 public abstract void convert(RViewHolder holder, T item);}
3.在Activity中的具体使用
private void setView() { layoutManager = new LinearLayoutManager(this); billRecycleView.setLayoutManager(layoutManager); //为RecycleView添加divider billRecycleView.addItemDecoration(new RecycleViewDivider( BillActivity.this, LinearLayoutManager.VERTICAL,1,getResources().getColor(R.color.lineColor2))); mAdapter = new RVCommonAdapter<BillRecordResEntity.ResultBean>(this, mData, R.layout.accumulate_income_layout_item) { @Override public void convert(RViewHolder holder, BillRecordResEntity.ResultBean item) { //为item填充数局 } }; billRecycleView.setAdapter(mAdapter); setListener();}private void setListener(){ //下拉刷新监听回调 billSwiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //下拉刷新回调 } }); //RecyclerView滑动监听 billRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition + 1 == mAdapter.getItemCount() && mAdapter.getFooterStatus() != mAdapter.NO_MORE) { //上拉加载更多回调 } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); } }); mAdapter.setOnItemClickListener(new RVCommonAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { //item click回调 } });}
4、RecycleViewDivider
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;public class RecycleViewDivider extends RecyclerView.ItemDecoration { private Paint mPaint; private Drawable mDivider; private int mDividerHeight = 2;//分割线高度,默认为1px private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; /** * 默认分割线:高度为2px,颜色为灰色 * * @param context * @param orientation 列表方向 */ public RecycleViewDivider(Context context, int orientation) { if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { throw new IllegalArgumentException("请输入正确的参数!"); } mOrientation = orientation; final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } /** * 自定义分割线 * * @param context * @param orientation 列表方向 * @param drawableId 分割线图片 */ public RecycleViewDivider(Context context, int orientation, int drawableId) { this(context, orientation); mDivider = ContextCompat.getDrawable(context, drawableId); mDividerHeight = mDivider.getIntrinsicHeight(); } /** * 自定义分割线 * * @param context * @param orientation 列表方向 * @param dividerHeight 分割线高度 * @param dividerColor 分割线颜色 */ public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) { this(context, orientation); mDividerHeight = dividerHeight; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(dividerColor); mPaint.setStyle(Paint.Style.FILL); } //获取分割线尺寸 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.set(0, 0, 0, mDividerHeight); } //绘制分割线 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); if (mOrientation == LinearLayoutManager.VERTICAL) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } //绘制横向 item 分割线 private void drawHorizontal(Canvas canvas, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getMeasuredWidth() - parent.getPaddingRight(); final int childSize = parent.getChildCount(); for (int i = 0; i < childSize; i++) { final View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + layoutParams.bottomMargin; final int bottom = top + mDividerHeight; if (mDivider != null) { mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } if (mPaint != null) { canvas.drawRect(left, top, right, bottom, mPaint); } } } //绘制纵向 item 分割线 private void drawVertical(Canvas canvas, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom(); final int childSize = parent.getChildCount(); for (int i = 0; i < childSize; i++) { final View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + layoutParams.rightMargin; final int right = left + mDividerHeight; if (mDivider != null) { mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } if (mPaint != null) { canvas.drawRect(left, top, right, bottom, mPaint); } } }}
阅读全文
0 0
- 打造RecycleView 通用适配器
- 打造通用的recycleview的adapter
- 打造RecyclerView的通用适配器
- android:打造万能通用适配器
- 打造自己的通用适配器
- Android:打造万能通用适配器
- 打造ViewPager的通用适配器CommonPagerAdapter
- recycleview适配器
- Android进阶之通用RecyclerView适配器打造方法
- Android教你如何一步步打造通用适配器
- RecyclerView系列之一:打造RecyclerView通用的适配器BaseAdapter
- RecycleView的通用适配器BaseQuickAdapter处理item中子控件的点击事件以及cardview卡片阴影
- 万能RecycleView适配器
- RecycleView适配器的封装
- RecycleView的适配器
- RecycleView适配器 Persener层
- 让偷懒更彻底——用Butterknife 来为recyclerview 打造通用适配器(上)
- 小白成长记——Android进阶之打造通用的适配器
- iOS之报错“Cannot create __weak reference in file using manual reference counting”解决办法
- Selenium2+Python2.0自动化测试【14】 上传文件
- 从零开始学 Java
- python 发送邮件
- 淘宝搜索/推荐系统背后深度强化学习与自适应在线学习的实践之路
- 打造RecycleView 通用适配器
- UVA 537
- linux的一些命令 -查看cc攻击-网口ip统计等
- Selenium下各浏览器driver的配置 火狐浏览器 System.setProperty("webdriver.firefox.bin","C:\\ProgramFiles\\MozillaFi
- 做到这些_才算是顶级程序员
- SVG进阶教程全攻略
- TLS/SSL 协议详解(1) 前言
- MyEclipse2017下创建Spring项目
- 自定义推送消息