简体   繁体   English

Recyclerview在列表中的每个项目上添加相同的项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM