Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当Kotlin中的RecyclerView为空时,如何显示其他视图?_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android 当Kotlin中的RecyclerView为空时,如何显示其他视图?

Android 当Kotlin中的RecyclerView为空时,如何显示其他视图?,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我想显示RecyclerView没有项目的信息,但无法检查Firestore集合是否为空。如何设置某种侦听器来检查RecyclerView是否有项 我假设您使用的是Firebase UI(否则您已经有一个查询回调要挂接)。在FirestoreRecyclerAdapter中,您可以覆盖: 如果有用的话,这里是我的解决方案。我只是在RecyclerView所在的片段中调用了这个函数: private fun setUpRecyclerView() { val viewManagerPort

我想显示RecyclerView没有项目的信息,但无法检查Firestore集合是否为空。如何设置某种侦听器来检查RecyclerView是否有项

我假设您使用的是Firebase UI(否则您已经有一个查询回调要挂接)。在FirestoreRecyclerAdapter中,您可以覆盖:


如果有用的话,这里是我的解决方案。我只是在RecyclerView所在的片段中调用了这个函数:

private fun setUpRecyclerView() {
    val viewManagerPortrait = LinearLayoutManager(activity)
    val viewManagerLandscape = GridLayoutManager(activity, 3)
    val query = docRef.orderBy("title", Query.Direction.ASCENDING)
    query.addSnapshotListener { p0, _ ->
        if (p0 != null) {

            if(p0.size() > 0) {
                emptyAds.visibility = View.GONE;
                listItems.visibility = View.VISIBLE
            }else {
                emptyAds.visibility = View.VISIBLE;
                listItems.visibility = View.GONE
            }
        }
    }
    val options = FirestoreRecyclerOptions.Builder<Item>()
        .setQuery(query,Item::class.java)
        .setLifecycleOwner(this)
        .build()
    mAdapter = ItemCardsAdapter(this,options)
    listItems.apply {
        setHasFixedSize(true)
        // use a linear layout manager if portrait, grid one else
        layoutManager = if(activity!!.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
            viewManagerLandscape
        else
            viewManagerPortrait
        adapter = mAdapter
    }
}
私人娱乐设置回收视图(){
val viewManagerPortrait=线性布局管理器(活动)
val viewManagerLandscape=GridLayoutManager(活动,3)
val query=docRef.orderBy(“标题”,query.Direction.升序)
query.addSnapshotListener{p0,\u0->
如果(p0!=null){
如果(p0.size()>0){
emptyAds.visibility=View.GONE;
listItems.visibility=View.VISIBLE
}否则{
emptyAdds.visibility=View.VISIBLE;
listItems.visibility=View.GONE
}
}
}
val options=FirestoreRecyclerOptions.Builder()
.setQuery(查询,项::class.java)
.setLifecycleOwner(此)
.build()
mAdapter=ItemCardsAdapter(此选项)
listItems.apply{
setHasFixedSize(真)
//如果是纵向,则使用线性布局管理器,否则使用栅格
layoutManager=if(活动!!.resources.configuration.orientation==configuration.orientation\u横向)
viewManagerLandscape
其他的
viewManagerPortrait
适配器=mAdapter
}
}

正如您所看到的,大小上的if语句(在SnapShotListener中)检查该引用处的数据库是否为空,在布局中而不是在RecyclerView中显示一条消息。

如何填充RV?Firebase用户界面?或者在查询/观察后手动执行?谢谢您的回答,您是对的,我使用了FirebaseUI,很抱歉我没有提到这一点,我今晚将尝试:)非常棒!:D再次感谢您的帮助,问题是我不知道如何以一种友好的方式制作侦听器,因为我将Java更改为Kotlin:)这是一个奇怪的怪癖。。。如果在Java中使用1个方法(称为SAM接口)编写侦听器接口,那么可以在Kotlin中使用lambda实现它。但是,如果在Kotlin中编写SAM接口,则不能使用lambda。因此,我更喜欢为lambda签名加上别名(使您能够方便地使用具有接口可读性的lambda)。仅供参考-您也可以传入方法引用而不是lambda,例如
{error->showError(error)}
可以是
::showError
(因为签名完全匹配)
recyclerView.adapter = MyAdapter(
            options,
            { count -> showHideNoData(count > 0) },
            { error -> showError(error) }
        )

...

fun showHideNoData(haveData: Boolean) { 
    recyclerView.isVisible = haveData
    noDataView.isVisible = !haveData
    errorView.isVisible = false
}

fun showError(error: FirebaseFirestoreException) {
    recyclerView.isVisible = false
    noDataView.isVisible = false
    errorView.isVisible = true
    // Logging & other UI changes
}
private fun setUpRecyclerView() {
    val viewManagerPortrait = LinearLayoutManager(activity)
    val viewManagerLandscape = GridLayoutManager(activity, 3)
    val query = docRef.orderBy("title", Query.Direction.ASCENDING)
    query.addSnapshotListener { p0, _ ->
        if (p0 != null) {

            if(p0.size() > 0) {
                emptyAds.visibility = View.GONE;
                listItems.visibility = View.VISIBLE
            }else {
                emptyAds.visibility = View.VISIBLE;
                listItems.visibility = View.GONE
            }
        }
    }
    val options = FirestoreRecyclerOptions.Builder<Item>()
        .setQuery(query,Item::class.java)
        .setLifecycleOwner(this)
        .build()
    mAdapter = ItemCardsAdapter(this,options)
    listItems.apply {
        setHasFixedSize(true)
        // use a linear layout manager if portrait, grid one else
        layoutManager = if(activity!!.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
            viewManagerLandscape
        else
            viewManagerPortrait
        adapter = mAdapter
    }
}