youth5201314 / banner

🔥🔥🔥Banner 2.0 来了!Android广告图片轮播控件,内部基于ViewPager2实现,Indicator和UI都可以自定义。
Apache License 2.0
12.86k stars 2.51k forks source link

adapter = BannerAdapter(null) 导致indicator不显示且开始一大段时间空白的问题 #918

Closed FlodCoding closed 4 years ago

FlodCoding commented 4 years ago

条件

当我设置一个Adapter的时候,传进去的数据是null

BUG描述

banner首先会空白很长一段时间,然后才出现图片开始自动滚动,而且设置了指示器,但是并没有显示出来。

问题

为什么Adapter不提供一个无参构造函数呢,而是需要传一个list进去, 我是想初始化的时候就设置adapter,获取到数据时才填充数据进去。 如果说获取数据后才构造一个adapter就会出现RecyclerView: No adapter attached; skipping layout的错误提示

附上代码

        banner.apply {
            addBannerLifecycleObserver(this@TabHomeFragment)
            indicator = CircleIndicator(requireContext())
            adapter = BannerAdapter(null)
            viewModel.banner.observe(this@TabHomeFragment, { list ->
                banner.adapter.setDatas(list)å

            })

        }
youth5201314 commented 4 years ago

BannerAdapter是一个抽象类,你可以继承做任何操作,并不是让你自己使用

FlodCoding commented 4 years ago

BannerAdapter是一个抽象类,你可以继承做任何操作,并不是让你自己使用

我是继承的,名字一样罢了

class BannerAdapter(list: List<BannerData>, private val onClick: ((BannerData) -> Unit)? = null) :
    com.youth.banner.adapter.BannerAdapter<BannerData, BannerAdapter.BannerViewHolder>(list) {

    override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder {
        val view = ImageView(parent.context).apply {
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
        }
        return BannerViewHolder(view)

    }

    override fun onBindView(holder: BannerViewHolder, data: BannerData, position: Int, size: Int) {
        bindLoadImageFromUrl(holder.view, data.image)
        holder.itemView.setOnClickListener {
            onClick?.invoke(data)
        }

    }

    class BannerViewHolder(val view: ImageView) : RecyclerView.ViewHolder(view)