打造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.VERTICALLinearLayoutManager.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
原创粉丝点击