RecyclerView:
public abstract class BaseRecAdapter extends RecyclerView.Adapter<BaseRecAdapter.RecyclerHolder> {
protected Context context;
protected List<Object> dataList;
protected LayoutInflater inflater;
private boolean baseOnClick = true;
protected ItemOnClickListener itemOnClickListener;
protected ItemLongOnClickListener itemLongOnClickListener;
protected ViewOnClickListener viewOnClickListener;
public void setItemOnClickListener(ItemOnClickListener itemOnClickListener) {
this.itemOnClickListener = itemOnClickListener;
}
public void setItemLongOnClickListener(ItemLongOnClickListener itemLongOnClickListener) {
this.itemLongOnClickListener = itemLongOnClickListener;
}
public void setViewOnClickListener(ViewOnClickListener viewOnClickListener) {
this.viewOnClickListener = viewOnClickListener;
}
public BaseRecAdapter(Context context, List<Object> dataList) {
this.context = context;
this.dataList = dataList;
inflater = LayoutInflater.from(context);
}
@Override
public int getItemCount() {
return dataList == null ? 0 : dataList.size();
}
@NonNull
@Override
public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return baseCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(@NonNull RecyclerHolder holder, int position) {
baseBindHolder(holder, position);
if (baseOnClick){
holder.itemView.setOnClickListener(v -> {
itemOnClickListener.onItemOnClick(dataList.get(position), position);
});
holder.itemView.setOnLongClickListener(view -> {
itemLongOnClickListener.onItemLongListener(dataList.get(position), position);
return true;
});
}
}
protected abstract RecyclerHolder baseCreateViewHolder(@NonNull ViewGroup parent, int viewType);
protected abstract void baseBindHolder(@NonNull RecyclerHolder holder, int position);
protected Object getObjectType(int position){
return dataList.get(position);
}
public void setDataList(List<Object> list){
dataList.clear();
notifyDataSetChanged();
dataList.addAll(list);
notifyDataSetChanged();
}
/**
* 设置是否使用基类点击和长按事件
* @param baseOnClick 默认true:使用
*/
public void setBaseOnClick(boolean baseOnClick) {
this.baseOnClick = baseOnClick;
}
public static class RecyclerHolder extends RecyclerView.ViewHolder {
public RecyclerHolder(View itemView) {
super(itemView);
}
}
public interface ItemOnClickListener {
void onItemOnClick(Object o, int position);
}
public interface ItemLongOnClickListener {
void onItemLongListener(Object o, int position);
}
public interface ViewOnClickListener {
void onViewListener(Object o, int position);
}
/************************* dataBinding ********************************/
protected RecyclerHolder baseHolder(int layoutId, ViewGroup parent) {
return new RecyclerHolder(DataBindingUtil.inflate(inflater, layoutId, parent, false).getRoot());
}
protected <DB extends ViewDataBinding> DB baseBinding(int variableId, RecyclerHolder holder, int position) {
DB db = DataBindingUtil.getBinding(holder.itemView);
db.setVariable(variableId, dataList.get(position));
db.executePendingBindings();
return db;
}
}
ListView:
public abstract class BaseListViewAdapter extends BaseAdapter {
protected Context context;
protected List<Object> dataList;
protected LayoutInflater inflater;
protected ViewOnClickListener viewOnClickListener;
public void setViewOnClickListener(ViewOnClickListener viewOnClickListener) {
this.viewOnClickListener = viewOnClickListener;
}
public BaseListViewAdapter(Context context, List<Object> dataList) {
this.context = context;
this.dataList = dataList;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return dataList == null ? 0 : dataList.size();
}
@Override
public Object getItem(int i) {
return dataList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
return getBaseView(i, view, viewGroup);
}
protected abstract View getBaseView(int i, View view, ViewGroup viewGroup);
public interface ViewOnClickListener {
void onViewListener(Object o, int position);
}
/************************* dataBinding ********************************/
protected <DB extends ViewDataBinding> DB baseDataBinding(View view, int variableId, int layoutId, ViewGroup parent, int position) {
DB binding;
if (view == null){
binding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
} else {
binding = DataBindingUtil.getBinding(view);
}
binding.setVariable(variableId, dataList.get(position));
return binding;
}
}
使用:
public class MyAdapter extends BaseRecAdapter {
private ItemRecBinding binding;
public MyAdapter(Context context, List<Object> dataList) {
super(context, dataList);
}
@Override
protected RecyclerHolder baseCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType){
case 0:
return baseHolder(R.layout.item_rec, parent);
}
return null;
}
@Override
protected void baseBindHolder(@NonNull RecyclerHolder holder, int position) {
switch (getItemViewType(position)){
case 0:
binding = baseBinding(BR.user, holder, position);
binding.txtName.setOnClickListener(view -> {
Toast.makeText(context, position + " - " + ((User) dataList.get(position)).name.get(), Toast.LENGTH_SHORT).show();
});
break;
}
}
@Override
public int getItemViewType(int position) {
Object object = getObjectType(position);
if(object instanceof User){
return 0;
}
return super.getItemViewType(position);
}
}
public class ViewAdapter extends BaseListViewAdapter {
private ItemRecBinding binding;
public ViewAdapter(Context context, List<Object> dataList) {
super(context, dataList);
}
@Override
protected View getBaseView(int i, View view, ViewGroup viewGroup) {
switch (getItemViewType(i)){
case 0:
binding = baseDataBinding(view, BR.user, R.layout.item_rec, viewGroup, i);
return binding.getRoot();
}
return null;
}
}