文章目录
记录自己使用封装的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);
}