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