RecyclerView仅显示Firebase中的一项 [英] RecyclerView shows just one item from Firebase

查看:100
本文介绍了RecyclerView仅显示Firebase中的一项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道关于这个问题的问题很少.但是他们都没有解决我的问题,尤其是我的代码在Kotlin中,并且新版本与 Fragments 一起使用.别急着说我的问题重复了.

I know there are few questions about this problem. But none of them didn't solve my problem especially my code is in Kotlin and new working with Fragments. Don't rush to say my question is duplicated.

我的问题恰恰是标题所说的,我的 RecyclerView 仅填充了Fragment Firebase 的一项(子项).

My problem is exactly what title said, my RecyclerView is populated just with one item(child) from Firebase in my Fragment.

适配器:

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
}
}

我在其中填充ReyclerView的片段:

 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>

希望您能理解,请帮助我,我真的需要完成此应用程序.

Hope you understand, please help me I really need to finish this app.

推荐答案

您将在每次迭代时重新创建数据集,因此它将始终具有最后添加的项,将datasource的实例化移动到循环之外.另外,请尝试不要在每次迭代时都添加适配器的值.将项目添加到数据源后,应将它们添加到适配器并将适配器设置在recyclerview中. :

You're recreating the dataset at every iteration, so it will always have the last added item, move the instantiation of the datasource to outside the loop. Also, try not adding the values for the adapter at every iteration. When you're done adding items to the datasource, then you should add them to the adapter and set the adapter in the 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()

这篇关于RecyclerView仅显示Firebase中的一项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆