RecyclerView с двумя запросами - PullRequest
1 голос
/ 13 мая 2019

Я делаю RecyclerView с двумя TextViews внутри каждой строки, первое TextView - это имя, второе - сколько предметов у этого пользователя у определенного элемента.

Я используюparse-platform db и моя схема выглядит следующим образом:

Users table:
objectId (String)
name  (String)
....
Items table:
objectId  (String)
item_name  (String)
count  (Number)
.....
User_item table:
objectId (String)
user_pointer  (Pointer)
item_pointer  (Pointer)
item_status  (String)
item_notes  (String)
......

Я пытаюсь узнать, сколько элементов у каждого пользователя, используя метод countInBackground и сохранить число в массиве, ночтобы сделать это, я должен сначала получить идентификаторы каждого пользователя по запросу, а затем получить число элементов по другому запросу.

Когда я пытаюсь сделать это, используя следующий код, приложение выдает сообщение java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Может ли кто-нибудь указать мне, что мне нужно сделать, чтобы решить эту проблему?


код метода в kotlin:

private fun getData(itemID: String?) {

        personsQuery.findInBackground { result, e ->
            if (e == null) {
                for (i in result.indices) {
                    val id = result[i].objectId //get the objectID
                    personIDDataList.add(id)    //add the objectID to the array list

                    val elementUsers = result[i].getString("name")
                    if (elementUsers != null) {
                        personDataList.add(elementUsers)
                    } else {
                        personDataList.add("")
                    }

                    val itemCountQuery = ParseQuery<ParseObject>("User_item")

                    val itemPointer = ParseObject.createWithoutData("Items", itemID)
                    itemCountQuery.whereEqualTo("item_pointer", itemPointer)

                    for (i2 in personIDDataList.indices) {
                        val userPointer = ParseObject.createWithoutData("Users", personIDDataList[i2])
                        itemCountQuery.whereEqualTo("user_pointer", userPointer)

                        itemCountQuery.countInBackground { count, error ->
                            if (error == null) {
                                countDataList.add(count)
                            } else {
                                Toast.makeText(context, resources.getString(R.string.something_went_wrong), Toast.LENGTH_LONG)
                                    .show()
                                Log.e("error", error.toString())
                            }
                        }
                    }
                }
            } else {
                Toast.makeText(context, resources.getString(R.string.something_went_wrong), Toast.LENGTH_LONG).show()
            }

            view?.recyclerView?.adapter = RVAdapter(personDataList, countDataList, this)
        }

    }

Код адаптера в kotlin:

class PartsUsersRVAdapter(
    internal var part: ArrayList<String>,
    internal var count: ArrayList<Number>,
    private val mOnClickListener: ListItemClickListener
) : RecyclerView.Adapter<PartsUsersRVAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.parts_users_recyclerview_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(position)
    }

    override fun getItemCount(): Int {
        return part.size
    }

    interface ListItemClickListener {
        fun onListItemClick(clickedItemIndex: Int)
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        var txtPersonName: TextView = itemView.part_user_list_name_text
        var txtCount: TextView = itemView.part_user_list_count_text

        init {
            itemView.setOnClickListener(this)
        }

        fun bind(listIndex: Int) {
            txtPersonName.text = part[listIndex]
            txtCount.text = count[listIndex].toString()
        }

        override fun onClick(v: View) {
            val clickedPosition = adapterPosition
            mOnClickListener.onListItemClick(clickedPosition)
        }
    }
}

Обновление:

Мне удалось обойти сбой, добавив countDataList.add(0) сразу после personDataList.add(elementUsers), но это совсем не хорошо для кода.

1 Ответ

2 голосов
/ 16 мая 2019

Все, что вам нужно сделать, это использовать count () вместо countInBackground (), как показано ниже:

private fun getCount(itemID: String?, id: String) {
    val itemCountQuery = ParseQuery<ParseObject>("User_item")
    itemCountQuery.cachePolicy = ParseQuery.CachePolicy.NETWORK_ELSE_CACHE
    itemCountQuery.orderByAscending("createdAt")

    val itemPointer = ParseObject.createWithoutData("Items", itemID)
    itemCountQuery.whereEqualTo("item_pointer", itemPointer)

    val userPointer = ParseObject.createWithoutData("Person", id)
    itemCountQuery.whereEqualTo("person_pointer", userPointer)

    countDataList.add(itemCountQuery.count())
}

удалите второй цикл for и используйте указанную выше функцию при добавлении в personDataList, чтобы ваш код выглядел следующим образом:

private fun getData(itemID: String?) {

    personsQuery.findInBackground { result, e ->
        if (e == null) {
            for (i in result.indices) {
                val id = result[i].objectId //get the objectID
                personIDDataList.add(id)    //add the objectID to the array list

                val elementUsers = result[i].getString("name")
                if (elementUsers != null) {
                    personDataList.add(elementUsers)
                    getCount(itemID, id)
                } else {
                    personDataList.add("")
                }
} else {
Toast.makeText(context,resources.getString(R.string.something_went_wrong), Toast.LENGTH_LONG).show()
        }

        view?.recyclerView?.adapter = RVAdapter(personDataList, countDataList, this)
    }

}

проверить имя таблицы и столбцы перед копированием и вставкой

...