[英]Recyclerview adds same item on every item in list
I have a problem with my recyclverview.I'm retriving a list from firebase and in this list getting recreated on every iteration that is makes. 我的recyclverview有问题,我正在从Firebase中检索一个列表,并且在进行此每次迭代时都会重新创建此列表。 My goal is that the all seperate items in the list should be printed out.
我的目标是应该打印出列表中所有单独的项目。
Here is my Recyclerview adapter 这是我的Recyclerview适配器
override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ItemsViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.card_view_fragment, viewGroup, false)
addItems(itemsList)
return ItemsViewHolder(view)
}
override fun onBindViewHolder(viewHolder: ItemsViewHolder, postion: Int) {
viewHolder.bindView(itemsList[postion])
}
override fun getItemCount(): Int {
return itemsList.count()
}
fun addItems(items: List<Items>) {
itemsList.addAll(items)
}
i can provide more code if needed 如果需要,我可以提供更多代码
Updated requested by Shermano Shermano要求的更新
fun getEanItems(eanCode: ArrayList<String?>) {
val service = RetrofitInstance().getRetrofitInstance().create(getItemApi::class.java)
GlobalScope.launch(Dispatchers.Main) {
repeat(eanCode.size) { count ->
val call = service.getItemsData(eanCode[count].toString())
delay(500)
call.enqueue(object : Callback<ItemsList> {
override fun onFailure(call: Call<ItemsList>, t: Throwable) {
Toast.makeText(context, "Could not fetch data", Toast.LENGTH_LONG).show()
}
override fun onResponse(call: Call<ItemsList>, response: Response<ItemsList>) {
Log.i(TAG, response.body().toString())
Toast.makeText(context, response.toString(), Toast.LENGTH_SHORT).show()
response.body()?.getitemsArrayList()?.let { generateItemsList(it) }
fun generateItemsList(getitemsArrayList: ArrayList<Items>) {
recyclerView?.apply {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
setHasFixedSize(true)
adapter = ItemsAdapter(getitemsArrayList)
}
}
I might be blind, but i dont see where i fit in this addItems in this code, im kinda stuck with my mindset of adapter = ItemsAdapter(getitemsArrayList) 我可能是瞎子,但我看不出这段代码中该addItems的位置,有点卡住了我的adapter = ItemsAdapter(getitemsArrayList)
Problem is in the onCreateViewHolder
method , where you have written addItems()
method. 问题出在
onCreateViewHolder
方法中,您在其中编写了addItems()
方法。
I would suggest you to refer documentation, here is the excerpt from the same: 我建议您参考文档,以下是摘录:
VH onCreateViewHolder (ViewGroup parent, int viewType)
Called when RecyclerView needs a new RecyclerView.ViewHolder of the given type to represent an item. 在RecyclerView需要新的给定类型的RecyclerView.ViewHolder来表示项目时调用。
This new ViewHolder should be constructed with a new View that can represent the items of the given type. 这个新的ViewHolder应该用一个新的View构造,该View可以代表给定类型的项目。 You can either create a new View manually or inflate it from an XML layout file.
您可以手动创建一个新视图,也可以从XML布局文件中对其进行充气。
The new ViewHolder will be used to display items of the adapter using onBindViewHolder(ViewHolder, int, List). 新的ViewHolder将用于通过onBindViewHolder(ViewHolder,int,List)显示适配器的项目。 Since it will be re-used to display different items in the data set, it is a good idea to cache references to sub views of the View to avoid unnecessary findViewById(int) calls.
由于它将被重新用于显示数据集中的不同项目,因此最好将对引用的引用的缓存存储在视图的子视图中,以避免不必要的findViewById(int)调用。
About adding items: I would say you should call addItems method from the place you want to add items into the list and there by in the RecyclerView. 关于添加项目:我想说您应该在RecyclerView中从要添加项目到列表中的位置调用addItems方法。
And I would say you should also add below line in your addItems method inside you have written in the adapter class: 我想说的是,您还应该在适配器类中编写的addItems方法下面添加以下行:
mAdapter.notifyItemRangeInserted(startPosition, itemcount);
调用时,您将传递itemlist addItems(itemsList)
和内部方法定义..您正在将相同列表的项目添加到自身中。
It works now thank you all for the responses giving me the right direction :) 现在可以正常工作了,谢谢大家给我正确方向的答复:)
fun fetchDataFromFirebase() {
val databaseReference = FirebaseDatabase.getInstance().getReference("EAN")
listOfArray = arrayListOf()
listOfItems = arrayListOf()
databaseReference.addValueEventListener(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {}
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (eanCodes in dataSnapshot.children) {
if (dataSnapshot.exists()) {
Log.i(TAG + "EAN", eanCodes.toString())
val eanItems = eanCodes.getValue(FirebaseEanCode::class.java)
listOfArray.add(eanItems?.eanValue)
}
}
getEanItems(listOfArray)
}
})
}
fun getEanItems(eanCode: ArrayList<String?>) {
val service = RetrofitInstance().getRetrofitInstance().create(getItemApi::class.java)
GlobalScope.launch(Dispatchers.Main) {
repeat(eanCode.size) { count ->
val call = service.getItemsData(eanCode[count].toString())
delay(2500)
call.enqueue(object : Callback<ItemsList> {
override fun onFailure(call: Call<ItemsList>, t: Throwable) {
Toast.makeText(activity, "Could not fetch data", Toast.LENGTH_LONG).show()
}
override fun onResponse(call: Call<ItemsList>, response: Response<ItemsList>) {
Log.i(TAG, response.body().toString())
Toast.makeText(activity, response.toString(), Toast.LENGTH_SHORT).show()
response.body()?.getitemsArrayList()?.let { generateItemsList(it) }
}
})
}
}
}
fun generateItemsList(getitemsArrayList: ArrayList<Items>) {
recyclerView?.apply {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
setHasFixedSize(true)
adapter = ItemsAdapter(addItems(getitemsArrayList))
recyclerView.setHasFixedSize(true)
}
}
fun addItems(items: ArrayList<Items>): ArrayList<Items> {
listOfItems.addAll(items)
recyclerView.setHasFixedSize(true)
recyclerView.adapter?.notifyDataSetChanged()
return listOfItems
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.