CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.21k stars 5.14k forks source link

BaseQuickAdapter能改成原来那种可以在参数里传递资源id的吗? #3763

Open SaltedFish-Extreme opened 1 year ago

SaltedFish-Extreme commented 1 year ago

这是我之前重写3.x版本的BaseQuickAdapter的adapter基类,这样就只需要在子类重写convert方法设置item数据就行了,不需要onCreateViewHolder回调

abstract class BaseAdapter<T>(@LayoutRes private val layoutResId: Int, data: MutableList<T>? = null) :
    BaseQuickAdapter<T, BaseViewHolder>(layoutResId, data)
class SimpleAdapter(dataList: MutableList<Response>) : BaseAdapter<Response>(R.layout.item_simple_list, dataList) {
override fun convert(holder: BaseViewHolder, item: Response) {
        ......
    }
}
lhjgege commented 1 year ago

你可以自己继承在封装啊。我觉得他的这种方式比较好适合viewbinding不然不方便扩展。

SaltedFish-Extreme commented 1 year ago

你可以自己继承在封装啊。我觉得他的这种方式比较好适合viewbinding不然不方便扩展。

😂在参数里绑定viewbinding更方便些吧,现在的BaseQuickAdapter没法直接继承在参数里设置,不大会改😥

lhjgege commented 1 year ago

你可以自己继承在封装啊。我觉得他的这种方式比较好适合viewbinding不然不方便扩展。

😂在参数里绑定viewbinding更方便些吧,现在的BaseQuickAdapter没法直接继承在参数里设置,不大会改😥

我都不会在参数里面设置viewbinding直接使用反射来获取viewbinding更方便。不然每次都是写重复代码难受很

SaltedFish-Extreme commented 1 year ago

我都不会在参数里面设置viewbinding直接使用反射来获取viewbinding更方便。不然每次都是写重复代码难受很

😂我原来接手过的一个项目在基类里封装的,然后子类继承一下,在泛型里写的,虽然是java的

public class BackFragment extends BaseMvvmFragment<FragmentBackBinding, ViewModel, BaseResponse> {}
SaltedFish-Extreme commented 1 year ago
public abstract class BaseMvvmFragment<VIEW extends ViewBinding,
        VIEW_MODEL extends BaseMvvmViewModel,
        DATA> extends Fragment implements Observer {
    protected VIEW_MODEL sViewModel;
    protected VIEW sViewBinding;

    protected BaseMvvmModel mvvmModelTag;
    protected BaseMvvmModel sLoadServiceMvvmModelTag;
    protected abstract View getLoadSirView();
    public abstract VIEW_MODEL getViewModel();
lhjgege commented 1 year ago
public abstract class BaseMvvmFragment<VIEW extends ViewBinding,
        VIEW_MODEL extends BaseMvvmViewModel,
        DATA> extends Fragment implements Observer {
    protected VIEW_MODEL sViewModel;
    protected VIEW sViewBinding;

    protected BaseMvvmModel mvvmModelTag;
    protected BaseMvvmModel sLoadServiceMvvmModelTag;
    protected abstract View getLoadSirView();
    public abstract VIEW_MODEL getViewModel();

简单封装一下这样子使用不是更简单了,只在泛型里面写Viewbinding就可以实现在获取Viewbinding了,然后直接使用 image

lhjgege commented 1 year ago

他的使用方式就是没有封装的 image

封装后使用 image

SaltedFish-Extreme commented 1 year ago

可以😉

SaltedFish-Extreme commented 1 year ago

写了个基类,和原来用的那种差不多了😉

abstract class AppAdapter<T>(@LayoutRes private val layoutResId: Int, data: List<T> = emptyList()) : BaseQuickAdapter<T, QuickViewHolder>(data) {
    override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder {
        return QuickViewHolder(layoutResId, parent)
    }
}
limuyang2 commented 1 year ago

他的使用方式就是没有封装的 image

封装后使用 image

很不错的封装。里面是用的反射么?

lhjgege commented 1 year ago

是的通过反射直接获取泛型Viewbinding,不用在子类中获取不然有点繁琐有点繁琐。

他的使用方式就是没有封装的 image 封装后使用 image

很不错的封装。里面是用的反射么?

是的通过反射直接获取泛型Viewbinding,不用在子类中获取不然有点繁琐。

lhjgege commented 1 year ago

他的使用方式就是没有封装的 image 封装后使用 image

很不错的封装。里面是用的反射么?

Viewbinding.zip

上面的文件就是针对你的文件进行了Viewbinding的封装的文件你可以放到你library里面。使用都是和上面的例子一样

lhjgege commented 1 year ago

image image image image

limuyang2 commented 1 year ago

他的使用方式就是没有封装的 image 封装后使用 image

很不错的封装。里面是用的反射么?

Viewbinding.zip 上面的文件就是针对你的文件进行了Viewbinding的封装的文件你可以放到你library里面。使用都是和上面的例子一样

这个我考虑下,因为之前没有用反射,就是因为有的同学对反射比较反感

wcy0312808 commented 1 year ago

其实在MultiItemAdapter添加各种addItemType会导致代码冗余的很,适当的抽离和使用反射会使代码简介很多很多,比如我在项目中的尝试:

class DetailsAdapter : BaseMultiItemAdapter<Floors>() {
    init {
        // 根据type添加返回type 滑动时会根据对应额Position去创建对应的Holder
        onItemViewType { position, list ->
            list[position].itemType
        }

        addDetailsVH(T_BRAND_HEADER.hashCode(), GDBrandHeaderVH::class.java, R.layout.item_vh_details_brand_header)

        addDetailsVH(T_TOP_BANNER.hashCode(), GDTopBannerVH::class.java, R.layout.item_vh_details_top_banner)

        addDetailsVH(T_PRESALE_PRICE.hashCode(), GDPresalePricesVH::class.java,R.layout.item_vh_details_presale_prices)

        addDetailsVH(T_ACTIVITY_PRICE.hashCode(), GDActivityPricesVH::class.java, R.layout.item_vh_activity_prices)
    }

    /**
     * 通过传递的过来的Class类型,创建出对应的ViewHolder
     */
    private fun <T : BaseGDVH> addDetailsVH(itemType: Int, vh: Class<T>, @LayoutRes layoutId: Int) {
        addItemType(itemType, object : OnMultiItemAdapterListener<Floors, T> {
            override fun onCreate(context: Context, parent: ViewGroup, viewType: Int): T {
                // 获取到默认的构造方法
                val constructors = vh.declaredConstructors[0]
                // 获取到绑定的view
                val view = LayoutInflater.from(context).inflate(layoutId, parent, false)
                return constructors.newInstance(view) as T
            }

            override fun onBind(holder: T, position: Int, item: Floors?) {
                if (item?.data == null) {
                    holder.onHiddenVh()
                    return
                }

                holder.onBindData(item.data)
            }

            override fun isFullSpanItem(itemType: Int): Boolean {
                // 商详的holder都是跨满屏幕
                return true
            }
        })
    }
}

这样就能省略很多addItemType的重复代码,而用反射单单创建一个实例应该还是比较容易接受的,但目前我遇到一个问题,就是如果才能更优雅的获取到Holder的实例呢,然后在其他特殊场景下进行数据的传递。