java.lang.IllegalStateException:在TopHeadlinesFragment上pb不能为null吗?

问题描述 投票:1回答:2

我正在开发新闻应用程序,并且已经使用进度栏实现了实时数据,但是我的代码中出现了以下异常

java.lang.IllegalStateException: pb must not be null
 at yodgorbek.komilov.musobaqayangiliklari.ui.TopHeadlinesFragment$initViewModel$2.onChanged(TopHeadlinesFragment.kt:60)
 at yodgorbek.komilov.musobaqayangiliklari.ui.TopHeadlinesFragment$initViewModel$2.onChanged(TopHeadlinesFragment.kt:22)
 at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)
 at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:144)
 at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:442)
 at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:394)
 at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
 at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
 at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
 at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
 at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
 at androidx.fragment.app.Fragment.performStart(Fragment.java:2637)
 at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:915)
 at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
 at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
 at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
 at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
 at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
 at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
 at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
 at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
 at android.os.Handler.handleCallback(Handler.java:873)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:201)
 at android.app.ActivityThread.main(ActivityThread.java:6820)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)

在我的TopHeadlinesFragment.kt类之下

class TopHeadlinesFragment : Fragment() {

    private  var binding: FragmentTopHeadlinesBinding? = null
    private val viewModel by viewModel<MainViewModel>()
    private lateinit var topHeadlinesAdapter: TopHeadlinesAdapter
    // private   val newsRepository: NewsRepository by inject()
    private  var article:List<Article>? = null


    //3
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(
            R.layout.fragment_top_headlines
            , container, false
        )
        val recyclerView = view.findViewById(R.id.recyclerView) as RecyclerView
        val pb = view.findViewById(R.id.pb) as ProgressBar
        topHeadlinesAdapter = TopHeadlinesAdapter(recyclerView.context, article)
        recyclerView.layoutManager = LinearLayoutManager(context)
        recyclerView.adapter = topHeadlinesAdapter
        initViewModel()

        binding?.lifecycleOwner
        return binding?.root


    }

    private fun initViewModel() {
        viewModel?.sportList?.observe(this, Observer { newList ->
            topHeadlinesAdapter.updateData(newList)
        })

        viewModel?.showLoading?.observe(this, Observer { showLoading ->
            pb.visibility = if (showLoading) View.VISIBLE else View.GONE
        })

        viewModel?.showError?.observe(this, Observer { showError ->
            (showError)
        })

        viewModel?.loadNews()
    }
}

fragment_top_headlines.xml以下

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ProgressBar
        android:id="@+id/pb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

我已遵循所有stackoverflow的建议,但并没有解决我的问题。我想知道我到底在哪里犯错,为了避免发生异常,我必须做什么。

我尝试过的

1。使缓存重新启动无效2.清理并重建项目3.我检查了进度条是否已经初始化。4.我也尝试了这个stackoverflow链接Android: Progressbar must not be null using Kotlin

在我的MainViewModel.kt下面

@ Suppress(“ UNCHECKED_CAST”)类MainViewModel(val newsRepository:NewsRepository):ViewModel(),CoroutineScope {//协程的后台工作val job = Job()//将Coroutine的默认线程定义为Main并添加作业覆盖val coroutineContext:CoroutineContext = Dispatchers.Main + job

val showLoading = MutableLiveData<Boolean>()
val sportList = MutableLiveData<List<Article>>()
val showError = SingleLiveEvent<String>()

fun loadNews() {
    // Show progressBar during the operation on the MAIN (default) thread
    showLoading.value = true
    // launch the Coroutine
    launch {
        // Switching from MAIN to IO thread for API operation
        // Update our data list with the new one from API
        val result = withContext(Dispatchers.IO) {
            newsRepository?.getNewsList()
        }
        // Hide progressBar once the operation is done on the MAIN (default) thread
        showLoading.value = false
        when (result) {

            is UseCaseResult.Success<*> -> {
                sportList.value = result.data as List<Article>
            }
            is Error -> showError.value = result.message
        }
    }
}

override fun onCleared() {
    super.onCleared()
    // Clear our job when the linked activity is destroyed to avoid memory leaks
    job.cancel()
}

}

android android-livedata android-progressbar android-mvvm lifecycleowner
2个回答
0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.