RecyclerView仅显示Firebase中的一个项目

时间:2018-05-10 11:15:30

标签: android firebase android-fragments android-recyclerview kotlin

我知道关于这个问题的问题很少。但是他们都没有解决我的问题,特别是我的代码在Kotlin中,而且新的 Fragments 。不要急于说我的问题是重复的。

我的问题正是标题所说的,我的 RecyclerView 只填充了我{{{> Firebase 中的一个项目(子项) 1}}。

适配器:

Fragment

我的片段,其中填充了ReyclerView:

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

项目布局:

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

希望你理解,请帮助我,我真的需要完成这个应用程序。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您在每次迭代时都会重新创建数据集,因此它将始终具有最后添加的项目,将datasource的实例化移动到循环外部。此外,尝试不要在每次迭代时添加适配器的值。完成向数据源添加项目后,应将它们添加到适配器并在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()