RecyclerView показывает только один элемент из Firebase - PullRequest
0 голосов
/ 10 мая 2018

Я знаю, что есть несколько вопросов по этой проблеме. Но никто из них не решил мою проблему, особенно мой код на Kotlin и новый, работающий с Fragments. Не спешите говорить, что мой вопрос дублирован.

Моя проблема именно в том, что сказал заголовок, мой RecyclerView заполнен только одним элементом (дочерним) из Firebase в моем 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>

Надеюсь, вы понимаете, пожалуйста, помогите мне, мне действительно нужно закончить это приложение.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы воссоздаете набор данных на каждой итерации, поэтому у него всегда будет последний добавленный элемент, переместите экземпляр 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()
0 голосов
/ 10 мая 2018

Вы создаете новый список с одним элементом в цикле и передаёте его адаптеру, чтобы у него был только один элемент для отображения, поэтому

Переместить эту внешнюю петлю

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

и инициализировать список вне for loop


 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...