RecyclerView 仅显示 Firebase 中的一个项目

3
我知道这个问题已经有一些相关的提问,但是没有一个能够解决我的问题,特别是考虑到我的代码是用Kotlin编写并且涉及到新的与片段(Fragments)协作的方式。请不要急着说我的问题是重复的。
我的问题确切地就是标题所说的,我的RecyclerView只从Firebase中获取了一个子项(item),而没有填充整个Fragment。
适配器(Adapter):
class NewsList(private val userList: List<News>) : RecyclerView.Adapter<NewsList.ViewHolder>() {

private val Context = this

override fun onBindViewHolder(p0: ViewHolder?, p1: Int) {
    val news: News = userList[p1]
    p0?.mesajTextView?.text = news.text
    val time = news.time
    val getTimeAgo = GetTimeAgo()
    val lastMsg = getTimeAgo.getTimeAgo(time, Context)
    p0?.timeNewsTextView!!.text = lastMsg
}

override fun onCreateViewHolder(p0: ViewGroup?, p1: Int): ViewHolder {
    val v = LayoutInflater.from(p0?.context).inflate(R.layout.news_layout, p0, false)
    return ViewHolder(v)
}

override fun getItemCount(): Int {
    return userList.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val mesajTextView = itemView.findViewById(R.id.mesajTextView) as TextView
    val timeNewsTextView = itemView.findViewById(R.id.timeNewsTextView) as TextView
}
}

我创建的RecyclerView填充的碎片:

 override fun onActivityCreated(savedInstanceState: Bundle?) {

      newsRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
   }




  private fun populalteQuestionsList() {
        val mChatDatabaseReference = FirebaseDatabase.getInstance().reference.child(Constants.NEWS)
        mListenerPopulateList = mChatDatabaseReference.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (convSnapshot in dataSnapshot.children) {
                    val  news = ArrayList<News>()
                    val conv = convSnapshot.getValue(News::class.java)
                    news.add(conv!!)
                    val adapter = NewsList(news)
                    newsRecyclerView!!.adapter = adapter
                    adapter.notifyDataSetChanged()
                }
            }
            override fun onCancelled(databaseError: DatabaseError) {

            }
        })
        mChatDatabaseReference.addListenerForSingleValueEvent(mListenerPopulateList)
    }

物品的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        card_view:cardCornerRadius="2dp"
        card_view:contentPadding="10dp"
        card_view:cardElevation="10dp">

        <RelativeLayout
            android:id="@+id/relativeLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp">

            <TextView
                android:id="@+id/mesajTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="64dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                tools:text="Mesaj" />

            <TextView
                android:id="@+id/timeNewsTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginEnd="16dp"
                android:layout_marginTop="4dp"
                android:maxLength="15"
                android:maxLines="1"
                android:textAppearance="?android:attr/textAppearanceSmall"
                tools:text="14:20" />
        </RelativeLayout>

    </android.support.v7.widget.CardView>
</LinearLayout>

希望你能理解,拜托你帮我一下,我真的需要完成这个应用程序。

2个回答

2
你正在创建一个只有一个元素的列表,并将其传递给适配器,以便它只显示一个元素,因此

请将此移至循环外部。

 val adapter = NewsList(news)
 newsRecyclerView!!.adapter = adapter
 adapter.notifyDataSetChanged()

for循环之外初始化列表


 val  news = ArrayList<News>()
 for (convSnapshot in dataSnapshot.children) {
     val conv = convSnapshot.getValue(News::class.java)
     news.add(conv!!)
  }
 val adapter = NewsList(news)
 newsRecyclerView!!.adapter = adapter
 adapter.notifyDataSetChanged()

注意fill_parent已被弃用,请使用match_parent


当然,@AndréKool,但我只是不想破坏时间戳,让我来做。 - Pavneet_Singh
非常感谢您的回答,两个都可以。不幸的是,我先看到了@Levi Albuquerque的答案。无论如何,我会给您点赞 :) 请继续保持。 - android
@android 哦,你选择了自己喜欢的答案,我很高兴能够帮助到你。虽然如果你将鼠标悬停在“回答时间”上,你就可以看到找到第一个回答者的确切时间范围,并且你也可以给他点个赞,这是免费的:P - Pavneet_Singh

0
你在每次迭代时重新创建数据集,因此它将始终具有最后添加的项目,请将数据源的实例化移至循环外部。此外,尝试不要在每次迭代中添加适配器的值。当你完成向数据源添加项目时,然后应将它们添加到适配器中,并设置适配器在RecyclerView中。
val  news = ArrayList<News>()
for (convSnapshot in dataSnapshot.children) {
     val conv = convSnapshot.getValue(News::class.java)
     news.add(conv!!)
}
val adapter = NewsList(news)
newsRecyclerView!!.adapter = adapter
adapter.notifyDataSetChanged()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接