From b3a51f064c4dfb27f54cd9526803338d2e8dc296 Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Sat, 13 Aug 2022 16:26:49 +0000 Subject: [PATCH] 添加注释,部分优化 --- app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java | 164 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 92 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java b/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java index d022444..a494dcf 100644 --- a/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java +++ b/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java @@ -1,16 +1,13 @@ package com.runt.open.mvvm.base.adapter; -import android.graphics.drawable.Drawable; +import android.util.Log; import android.view.LayoutInflater; import android.view.ViewGroup; - import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; - -import com.runt.open.mvvm.base.activities.BaseActivity; import com.runt.open.mvvm.databinding.LayoutNullBinding; -import com.runt.open.mvvm.util.DeviceUtil; +import com.runt.open.mvvm.util.DimensionUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -20,50 +17,69 @@ /** * Created by Administrator on 2021/10/27 0027. - * T 数据类型 - * V 适配器视图 + * DATA 数据类型 + * VB 适配器视图 */ -public abstract class BaseAdapter<B extends ViewBinding,T> extends RecyclerView.Adapter { +public abstract class BaseAdapter<DATA, VB extends ViewBinding> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - protected List<T> mData = new ArrayList<>(); + protected List<DATA> dataList = new ArrayList<>(); + protected OnItemClickListener<DATA> onItemClickListener; + public boolean showNull; + public float defaultMarginBottom,lastMarginBottom; - protected Drawable nullDrawable; - protected String nullTxt="暂无数据"; - protected String TAG = "BaseAdapter"; - protected BaseActivity activity; - - public BaseAdapter(){ + public interface OnItemClickListener<DATA>{ + void onItemClick(int position,DATA data); } - public BaseAdapter(@NonNull List<T> data){ - mData = data; + public class ViewBindHolder extends RecyclerView.ViewHolder { + ViewBinding binding; + public ViewBindHolder(ViewBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } } - public List<T> getData() { - return mData; + public void setOnItemClickListener(OnItemClickListener<DATA> onItemClickListener) { + this.onItemClickListener = onItemClickListener; } - public void setData(@NonNull List<T> data){ - mData = data; + public void setData(List<DATA> list){ + if(dataList != list) { + dataList.clear(); + if (list != null) { + dataList.addAll(list); + } + } notifyDataSetChanged(); + } + + public void addData(DATA data){ + if(data != null){ + dataList.add(data); + } + notifyDataSetChanged(); + } + + public void addData(List<DATA> list){ + if (list != null && list.size() > 0) { + this.dataList.addAll(list); + } + notifyDataSetChanged(); + } + + public List<DATA> getData() { + return dataList; } @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + public ViewBindHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if(viewType == 1 ){ - // get genericity "B" - Class<B> entityClass = (Class<B>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; try { - /* for(Method method: entityClass.getMethods()){ - StringBuilder sb = new StringBuilder(); - for(Class type : method.getParameterTypes()){ - sb.append(type.getSimpleName()+","); - } - Log.e(TAG,String.format("method:%s,return:%s,param:%s",method.getName(),method.getReturnType().getSimpleName(),sb.toString())); - }*/ + //实例化viewbind + Class<VB> entityClass = (Class<VB>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1]; Method method = entityClass.getMethod("inflate", LayoutInflater.class,ViewGroup.class,boolean.class);//get method from name "inflate"; - B vBind = (B) method.invoke(entityClass,LayoutInflater.from(parent.getContext()),parent,false);//execute method to create a objct of viewbind; + VB vBind = (VB) method.invoke(entityClass,LayoutInflater.from(parent.getContext()),parent,false);//execute method to create a objct of viewbind; return new ViewBindHolder(vBind); } catch (SecurityException e) { e.printStackTrace(); @@ -80,19 +96,25 @@ e.printStackTrace(); } } - return new NullViewHolder( LayoutNullBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false)); + //加载空数据 + return new ViewBindHolder( LayoutNullBinding.inflate( LayoutInflater.from(parent.getContext()), parent, false ) ); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - //MyLog.i(TAG,"onBindViewHolder position:"+position+" "+mData.size()+" "+getItemViewType(position)); - if(activity == null){ - activity = (BaseActivity) holder.itemView.getContext(); - } - if(getItemViewType(position)==0){ - bindView((NullViewHolder) holder); - }else { - bindView((ViewBindHolder) holder, mData.size() == 0 ? null : mData.get(position), position); + ViewBindHolder bindHolder = (ViewBindHolder) holder; + if(getItemViewType(position) == 0 || bindHolder.binding instanceof LayoutNullBinding){ + onBindEmptyView((LayoutNullBinding) bindHolder.binding); + }else{ + if (onItemClickListener != null) { + bindHolder.binding.getRoot().setOnClickListener(view -> { + if(onItemClickListener != null){ + onItemClickListener.onItemClick(position,getItem(position)); + } + }); + } + onBindView((VB) bindHolder.binding, position, getItem(position)); + setBottomMargin(bindHolder,position); } } @@ -102,7 +124,7 @@ * @param position */ protected void setBottomMargin(ViewBindHolder holder, int position){ - setBottomMargin(holder,position,23); + setBottomMargin(holder,position,lastMarginBottom); } /** @@ -111,56 +133,54 @@ * @param position 位置 * @param dp 间距 */ - protected void setBottomMargin(RecyclerView.ViewHolder holder, int position,int dp){ - setBottomMargin(holder,position,dp,0); + protected void setBottomMargin(RecyclerView.ViewHolder holder, int position,float dp){ + setBottomMargin(holder,position,dp,defaultMarginBottom); } - protected void setBottomMargin(RecyclerView.ViewHolder holder, int position, int dp, int defaultDp){ + + protected void setBottomMargin(RecyclerView.ViewHolder holder, int position, float dp, float defaultDp){ ViewGroup.MarginLayoutParams params1 = (ViewGroup.MarginLayoutParams) holder.itemView.getLayoutParams(); - if(position == mData.size() -1){ - params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, DeviceUtil.convertDpToPixel(dp,holder.itemView.getContext())); + if(position == dataList.size() -1){ + params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, (int) DimensionUtils.convertDpToPixel(dp,holder.itemView.getContext())); }else{ - params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, DeviceUtil.convertDpToPixel(defaultDp,holder.itemView.getContext())); + params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, (int) DimensionUtils.convertDpToPixel(defaultDp,holder.itemView.getContext())); } } - protected abstract void bindView(ViewBindHolder holder,T data,int position); - protected void bindView(NullViewHolder holder){ - - } - + /** + * 空数据支持 + * @return + */ @Override public int getItemCount() { - //默认显示空视图,若不显示空视图则重写该方法,返回mData.size() - return mData == null || mData.size() == 0 ?1:mData.size(); + return (showNull && dataList.size() == 0 )? 1 : dataList.size(); } - + /** + * 当下标为0,数据集合为0 返回0(意味当前应显示空数据视图)) + * @param position + * @return + */ @Override public int getItemViewType(int position) { - //当下标为0,数据集合为0 返回0(意味当前应显示空数据视图)) - //MyLog.i(TAG,"getItemViewType position:"+position+" mdata:"+mData.size()+" "+(position ==0 && mData.size()==0)); - return position == 0 && mData.size()==0?0:1; + return (showNull && position == 0 && dataList.size() == 0)? 0 : 1; } - public class ViewBindHolder extends RecyclerView.ViewHolder{ - public B binding; - public ViewBindHolder( B binding) { - super(binding.getRoot()); - this.binding = binding; + public DATA getItem(int position){ + if(position >= dataList.size()){ + return null; + }else { + return dataList.get(position); } } + + protected abstract void onBindView(VB binding, int position, DATA data); + /** * 空数据显示 - * Created by Administrator on 2021/10/28 0028. */ - public class NullViewHolder extends RecyclerView.ViewHolder { - LayoutNullBinding binding; + protected void onBindEmptyView(LayoutNullBinding emptyBinding){ + Log.e("baseAdapter"," emptyBinding:"+emptyBinding); - public NullViewHolder(LayoutNullBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } } - } -- Gitblit v1.9.1