youth5201314 / banner

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

Fragment添加Banner失败 #711

Closed hl-lab closed 4 years ago

hl-lab commented 4 years ago

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.recyclerview.widget.RecyclerView.canScrollVertically(int)' on a null object reference at androidx.recyclerview.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:10378) at androidx.viewpager2.widget.ViewPager2$LinearLayoutManagerImpl.onInitializeAccessibilityNodeInfo(ViewPager2.java:1017) at com.youth.banner.util.ProxyLayoutManger.onInitializeAccessibilityNodeInfo(ProxyLayoutManger.java:91) at androidx.recyclerview.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:10348) at androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityNodeInfo(RecyclerViewAccessibilityDelegate.java:74) at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompat.java:86) at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7343) at android.view.View.createAccessibilityNodeInfoInternal(View.java:7304) at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:26223) at android.view.View.createAccessibilityNodeInfo(View.java:7287) at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:146) at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119) at android.view.View.onInitializeAccessibilityEventInternal(View.java:7241) at android.view.View$AccessibilityDelegate.onInitializeAccessibilityEvent(View.java:26106) at androidx.core.view.AccessibilityDelegateCompat.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:256) at androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityEvent(RecyclerViewAccessibilityDelegate.java:80) at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:76) at android.view.View.onInitializeAccessibilityEvent(View.java:7227) at androidx.viewpager2.widget.ViewPager2$RecyclerViewImpl.onInitializeAccessibilityEvent(ViewPager2.java:982) at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:7091) at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:26045) at androidx.core.view.AccessibilityDelegateCompat.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:195) at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:112) at android.view.View.sendAccessibilityEventUnchecked(View.java:7074) at androidx.recyclerview.widget.RecyclerView.sendAccessibilityEventUnchecked(RecyclerView.java:3736) at android.view.View.sendAccessibilityEventInternal(View.java:7053) at android.view.View$AccessibilityDelegate.sendAccessibilityEvent(View.java:26003) at androidx.core.view.AccessibilityDelegateCompat.sendAccessibilityEvent(AccessibilityDelegateCompat.java:173) at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.sendAccessibilityEvent(AccessibilityDelegateCompat.java:107) at android.view.View.sendAccessibilityEvent(View.java:7018) at android.view.View$SendViewScrolledAccessibilityEvent.run(View.java:25909) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7425) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

LeonShannon commented 4 years ago

同样的问题,alpha03 就没有,beta就出现了

youth5201314 commented 4 years ago

新版增加了滑动速度的控制,但是我测试没有问题才提交的。你贴一下你的使用代码看看

hl-lab commented 4 years ago

新版增加了滑动速度的控制,但是我测试没有问题才提交的。你贴一下你的使用代码看看

@youth5201314

环境: IDE:Android Studio 3.6.1 gradle:implementation 'com.youth.banner:banner:2.0.0-beta01' kotlin_version = '1.3.71'

步骤: 1、创建新项目,使用 Button Navigation Activity 模版 2、res -> layout -> fragment_home.xml 修改代码:

<com.youth.banner.Banner
        android:id="@+id/banner_home"
        android:layout_width="match_parent"
        android:layout_height="200dp"

        app:layout_constraintTop_toBottomOf="@+id/title_text_home" />
        />

3、package:com.xxxx.xxxx.ui.home -> HomeFragment.kt 修改代码

package com.xxxx.xxxx.ui.home

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.RecyclerView
import com.xxxx.xxxx.R
import com.youth.banner.Banner
import com.youth.banner.adapter.BannerAdapter
import com.youth.banner.indicator.CircleIndicator

class HomeFragment : Fragment() {

    private lateinit var homeViewModel: HomeViewModel

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        homeViewModel =
                ViewModelProviders.of(this).get(HomeViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_home, container, false)
//        val textView: TextView = root.findViewById(R.id.text_home)
        homeViewModel.text.observe(viewLifecycleOwner, Observer {
//            textView.text = it
        })

        root.findViewById<Banner<DataBean, ImageAdapter>>(R.id.banner_home)
            .setAdapter(ImageAdapter(DataBean.getTestData3()))
            .setOrientation(Banner.VERTICAL)
            .setIndicator(CircleIndicator(root.context))
            .setUserInputEnabled(false)

        return root
    }

    /**
     * 自定义布局,下面是常见的图片样式,更多实现可以看demo,可以自己随意发挥
     */
    class ImageAdapter(mDatas: List<DataBean?>?) :
        BannerAdapter<DataBean?, ImageAdapter.BannerViewHolder?>(mDatas) {
        //创建ViewHolder,可以用viewType这个字段来区分不同的ViewHolder
        override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder {
            val imageView = ImageView(parent.context)
            //注意,必须设置为match_parent,这个是viewpager2强制要求的
            imageView.setLayoutParams(
                ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT
                )
            )
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
            return BannerViewHolder(imageView)
        }

        override fun onBindView(
            holder: BannerViewHolder?,
            data: DataBean?,
            position: Int,
            size: Int
        ) {
            if (data != null) {
                data.imageRes?.let {
                    holder?.imageView?.setImageResource(it)
                }
            }
        }

        inner class BannerViewHolder(view: ImageView) :
            RecyclerView.ViewHolder(view) {
            var imageView: ImageView

            init {
                imageView = view
            }
        }
    }
}

class DataBean {
    var imageRes: Int? = null
    var imageUrl: String? = null
    var title: String? = null
    var viewType = 0

    constructor(imageUrl: String?, title: String?, viewType: Int) {
        this.imageUrl = imageUrl
        this.title = title
        this.viewType = viewType
    }

    companion object {
        fun getTestData3(): List<DataBean>? {
            val list: MutableList<DataBean> = ArrayList()
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/011ad05e27a173a801216518a5c505.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/0148fc5e27a173a8012165184aad81.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/013c7d5e27a174a80121651816e521.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/01b8ac5e27a173a80120a895be4d85.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/01a85d5e27a174a80120a895111b2c.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/01085d5e27a174a80120a8958791c4.jpg",
                    null,
                    1
                )
            )
            list.add(
                DataBean(
                    "https://img.zcool.cn/community/01f8735e27a174a8012165188aa959.jpg",
                    null,
                    1
                )
            )
            return list
        }
    }
}
youth5201314 commented 4 years ago

我测试好多场景都没有问题,你用最新版本的试下呢?我稍后再demo中给出例子

LeonShannon commented 4 years ago

我测试好多场景都没有问题,你用最新版本的试下呢?我稍后再demo中给出例子

不是必发现象,估计跟系统有关系。我用的坚果pro(7.1.1系统)就会必显,然后一加3一加5(都是9.0),还有模拟器9的系统就不会发生这样的问题

hl-lab commented 4 years ago

我测试好多场景都没有问题,你用最新版本的试下呢?我稍后再demo中给出例子

不是必发现象,估计跟系统有关系。我用的坚果pro(7.1.1系统)就会必显,然后一加3一加5(都是9.0),还有模拟器9的系统就不会发生这样的问题

我测试的机器是荣耀8青春版(8.0.0)

onism0106 commented 4 years ago

我的也是在坚果锤子手机上,系统是7.1.1,所有banner都挂了