recyclerview封装使用

记录自己使用封装的RecyclerView,最近加入了过滤器Filter

CommonFilterAdapter

CommonFilterAdapter使用方法:
	private void setRecyclerView() {
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.addItemDecoration(new SimpleDividerDecoration(this));
        adapters = new CommonFilterAdapter<CarResultMap>(this, R.layout.layout_history_list, lists) {
            @Override
            public void convert(ViewHolder holder, CarResultMap data, int position) {
                holder.setTextAndColor(R.id.tv_name, data.getmCode(), getResources().getColor(p));
            }
        };
        recyclerView.setAdapter(adapters);
    }
    
	//监听搜索框
	etSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapters.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

移除某一项可以使用:adapters.removeData();

package com.app.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public abstract class CommonFilterAdapter<T> extends RecyclerView.Adapter<ViewHolder> implements Filterable
{
    protected Context mContext;
    protected int mLayoutId;
    protected List<T> mDatas;
    protected LayoutInflater mInflater;

    public CommonFilterAdapter(Context context, int layoutId, List<T> datas)
    {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        mLayoutId = layoutId;
        mDatas = datas;
        mSourceList = mDatas;
    }

    @Override
    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType)
    {
        ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutId);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position)
    {
        if(null != mDatas) {
            convert(holder, mDatas.get(position), position);
        }
    }

    public abstract void convert(ViewHolder holder, T t , int position);

    @Override
    public int getItemCount()
    {
        return mDatas.size();
    }

    //移除数据
    public void removeData(int position) {
        mDatas.remove(position);
        notifyItemRemoved(position);
        if(position != mDatas.size()){ // 如果移除的是最后一个,忽略
            notifyItemRangeChanged(position, mDatas.size() - position);
        }
    }

    private List<T> mSourceList = new ArrayList<>();

    @Override
    public Filter getFilter() {
        return new Filter() {
            //执行过滤操作
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    //没有过滤的内容,则使用源数据
                    mDatas = mSourceList;
                } else {
                    List<T> filteredList = new ArrayList<>();
                    for (T str : mSourceList) {
                        //这里根据需求,添加匹配规则
                        if (str.toString().contains(charString)) {
                            filteredList.add(str);
                        }
                    }

                    mDatas = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mDatas;
                return filterResults;
            }
            //把过滤后的值返回出来
            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mDatas = (List<T>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    //    private View mHeaderView;
//
//    public void setHeaderView(View headerView) {
//        mHeaderView = headerView;
//        notifyItemInserted(0);
//    }
//
//    public View getHeaderView() {
//        return mHeaderView;
//    }
//
//    //新增数据
//    public void addData(int position,T t) {
//        mDatas.add(position, t);
//        notifyItemInserted(position);
//    }
//
//    //更改某个位置的数据
//    public void changeData(int position) {
//        mDatas.set(position, "Item " + position + " has changed");
//        notifyItemChanged(position);
//    }
}

ViewHolder 复用对象

package com.app.adapter;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

public class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;
    private View mConvertView;
    private Context mContext;

    public ViewHolder(Context context, View itemView) {
        super(itemView);
        mContext = context;
        mConvertView = itemView;
        mViews = new SparseArray<View>();
    }

    public static ViewHolder get(Context context, ViewGroup parent, int layoutId) {

        View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        ViewHolder holder = new ViewHolder(context, itemView);
        return holder;
    }

    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;
    }

    public ViewHolder setBtnText(int viewId, String text) {
        Button tv = getView(viewId);
        if (tv == null) {
            return null;
        }
        tv.setText(text);
        return this;
    }

    public ViewHolder setVisibility(int viewId, int isVisible) {
        View tv = getView(viewId);
        if (tv == null) {
            return null;
        }
        tv.setVisibility(isVisible);
        return this;
    }

    public int getVisibility(int viewId) {
        View tv = getView(viewId);
        return tv.getVisibility();
    }

    public ViewHolder setText(int viewId, String text) {
        TextView tv = getView(viewId);
        if (tv == null) {
            return null;
        }
        tv.setText(text);
        return this;
    }

    public ViewHolder setTextAndColor(int viewId, String text, int color) {
        TextView tv = getView(viewId);
        if (tv == null) {
            return null;
        }
        tv.setText(text);
        tv.setTextColor(color);
        return this;
    }

    public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    public ViewHolder setSelected(int viewId, boolean selected) {
        View view = getView(viewId);
        view.setSelected(selected);
        return this;
    }

    public ViewHolder setOnClickListener(int viewId, int position, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setTag(position);
        view.setOnClickListener(listener);
        return this;
    }

    public ViewHolder setOnCheckedChangeListener(int viewId, CompoundButton.OnCheckedChangeListener listener) {
        CheckBox view = getView(viewId);
        view.setOnCheckedChangeListener(listener);
        return this;
    }

}

SimpleDividerDecoration分割线

package com.app.adapter;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;

import androidx.recyclerview.widget.RecyclerView;

import com.app.R;

public class SimpleDividerDecoration extends RecyclerView.ItemDecoration {

    private int dividerHeight;
    private Paint dividerPaint;

    public SimpleDividerDecoration(Context context) {
        dividerPaint = new Paint();
        dividerPaint.setColor(context.getResources().getColor(R.color.gray3));
        dividerHeight = context.getResources().getDimensionPixelSize(R.dimen.recyclerview_divider_height);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.bottom = dividerHeight;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int childCount = parent.getChildCount();
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        for (int i = 0; i < childCount - 1; i++) {
            View view = parent.getChildAt(i);
            float top = view.getBottom();
            float bottom = view.getBottom() + dividerHeight;
            c.drawRect(left, top, right, bottom, dividerPaint);
        }
    }
}

MultiItemCommonAdapter使用方法:
	private void setRecyclerView() {
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        MultiItemTypeSupport<CarMessage> support = new MultiItemTypeSupport<CarMessage>() {
            @Override
            public int getLayoutId(int itemType) {
                if(itemType == 1)
                {
                    return R.layout.layout_car_list2;
                }
                return R.layout.layout_car_list;
            }
            @Override
            public int getItemViewType(int position, CarMessage carMessage) {
                if(position % 2 == 0){
                    return 0;
                }
                return 1;
            }
        };
        MultiItemCommonAdapter<CarMessage> adapters = new MultiItemCommonAdapter<CarMessage>(this, lists, support) {
            @Override
            public void convert(ViewHolder holder, CarMessage data, int position) {
                holder.setText(R.id.tv_name, data.getmName());
                holder.setOnClickListener(R.id.btn_to_test, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                    
                    }
                });
            }
        };
        recyclerView.setAdapter(adapters);
    }

MultiItemCommonAdapter——使用多个xml布局

package com.app.adapter;


import android.content.Context;
import android.view.ViewGroup;

import java.util.List;

public abstract class MultiItemCommonAdapter<T> extends CommonAdapter<T> {
    protected MultiItemTypeSupport<T> mMultiItemTypeSupport;

    public MultiItemCommonAdapter(Context context, List<T> datas, MultiItemTypeSupport<T> multiItemTypeSupport) {
        super(context, -1, datas);
        mMultiItemTypeSupport = multiItemTypeSupport;
    }

    @Override
    public int getItemViewType(int position) {
        return mMultiItemTypeSupport.getItemViewType(position, mDatas.get(position));
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int layoutId = mMultiItemTypeSupport.getLayoutId(viewType);
        ViewHolder holder = ViewHolder.get(mContext, parent, layoutId);
        return holder;
    }

}

MultiItemTypeSupport

package com.app.adapter;

public interface MultiItemTypeSupport<T> {

    int getLayoutId(int itemType);

    int getItemViewType(int position, T t);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值