Почему мой RecyclerView показывает одно и то же значение на каждой итерации? - PullRequest
0 голосов
/ 25 февраля 2019

Показывает правильное количество объектов, но присваивает им одинаковое значение.

Справочная информация: Я следую совету по созданию Slack-подобного приложения.Я использую представление рециркулятора для отображения списка каналов.

Это мой адаптер

class ChannelsAdapter(val context: Context, val channels: ArrayList<Channel>) :
    RecyclerView.Adapter<ChannelsAdapter.Holder>() {

    inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val singleChannel = itemView.findViewById<TextView>(R.id.single_channel)

        fun bindText(textVar: String, context: Context) {
            singleChannel.text = textVar
        }
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.bindText(channels[position].toString(), context)
    }

    override fun getItemCount(): Int {
        return channels.count()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {

        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.channel_list_layout, parent, false)
        return Holder(view)

    }
}

Это класс "канала":

class Channel(val name: String, val Description: String, val id: String) {

    override fun toString(): String {
        return ("#$name")
    }

}

Этоэто переменная, данные, которые назначаются для RecyclerView, и функции, которые извлекают данные с сервера и

object MessageService {

    val channels = ArrayList<Channel>()

    fun getChannels(context: Context, complete: (Boolean) -> Unit) {

        val channelsRequest =
            object : JsonArrayRequest(Method.GET, URL_GET_CHANNELS, null, Response.Listener { response ->

                try {

                    for (x in 0 until (response.length())) {
                        val channel = response.getJSONObject(0)
                        val channelName = channel.getString("name")
                        val channelDescription = channel.getString("description")
                        val channelId = channel.getString("_id")

                        val newChannel = Channel(channelName, channelDescription, channelId)
                        this.channels.add(newChannel)

                    }
                    complete(true)

                } catch (e: JSONException) {
                    Log.d("JSON", "EXC:" + e.localizedMessage)
                    complete(false)
                }

            }, Response.ErrorListener {
                Log.d("ERROR", "Could not retrieve channels")
                complete(false)
            }) {

                override fun getBodyContentType(): String {
                    return "application/json; charset=utf-8"
                }

                override fun getHeaders(): MutableMap<String, String> {
                    val headers = HashMap<String, String>()

                    headers.put("Authorization", "Bearer ${AuthService.authToken}")
                    return headers
                }
            }

        Volley.newRequestQueue(context).add(channelsRequest)

    }

}

Этот val получает свои данные с сервера в виде JsonArray.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Проверьте, где вы инициализируете Шанель и переходите в список каналов.Убедитесь, что каждый канал инициализируется внутри цикла, который добавляет канал в список.Случилось со мной некоторое время назад, например

   while(true) {
   Channel myChanel= new Channel()
   myChanel.name = "name"
   channels.add(myChanel)
   } 
// Pass list into adapter. Convert to kotlin :)
0 голосов
/ 26 февраля 2019

Моя проблема была в цикле извлечения информации с сервера, глупая ошибка.

for (x in 0 until (response.length())) {
                        val channel = response.getJSONObject(0)
                        val channelName = channel.getString("name")
                        val channelDescription = channel.getString("description")
                        val channelId = channel.getString("_id")

Я продолжал вытягивать объект "0" вместо "x"

0 голосов
/ 25 февраля 2019

Просто измените свой onBindViewHolder как этот

override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.bindText(channels[position], context)
    }

И ваш bindText функция, как это

inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val singleChannel = itemView.findViewById<TextView>(R.id.single_channel)

        fun bindText(data: Channel, context: Context) {
            singleChannel.text = data.name
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...