我正在制作一个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
方法并将其保存到数组列表中,但是要做到这一点,我必须先通过查询获取每个用户的ID然后通过另一个查询获取商品数量。
当我尝试使用以下代码使应用崩溃时,给出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)
来绕过崩溃,但这对代码根本不好。
答案 0 :(得分:1)
您要做的就是使用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)
}
}
在复制和粘贴之前检查表名和列