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

时间:2019-09-11 18:57:19

标签: android android-recyclerview retrofit2 recycler-adapter

我的recycleverview出现问题。我正在从Firebase中检索一个列表,并且在进行每次迭代时都会重新创建此列表。我的目标是应该打印出列表中所有单独的项目。

这是我的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)
}

如果需要,我可以提供更多代码

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)

    }
}

我可能是盲人,但是我在这段代码中看不到我适合该addItems的位置,我有点卡住了我的adapter = ItemsAdapter(getitemsArrayList)

3 个答案:

答案 0 :(得分:0)

问题在onCreateViewHolder方法中,您已经在其中编写了addItems()方法。

我建议您参考文档,以下是摘录:

VH onCreateViewHolder (ViewGroup parent, int viewType)

当RecyclerView需要新的给定类型的RecyclerView.ViewHolder来表示商品时调用。

此新的ViewHolder应该使用可以代表给定类型的项目的新View构造。您可以手动创建一个新视图,也可以从XML布局文件中对其进行充气。

新的ViewHolder将用于通过onBindViewHolder(ViewHolder,int,List)显示适配器的项目。由于将其重新用于显示数据集中的不同项目,因此最好将对引用的引用的缓存存储在视图的子视图中,以避免不必要的findViewById(int)调用。

关于添加项目: 我想说,您应该从要在列表中添加项目的位置调用ReItemerView中的addItems方法。

我想说的是,您还应该在适配器类中编写的addItems方法下面添加以下行:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

答案 1 :(得分:0)

在调用时,您正在传递项目列表addItems(itemsList)和内部方法定义..您正在将相同列表的项目添加到自身中。

答案 2 :(得分:0)

现在可以正常工作了,谢谢大家给我正确方向的答复:)

public function User()
{
    return $this->hasOne('App\User','id','user_id');
}
public function Category()
{
    return $this->hasOne('App\Category','id','category_id');
}
public function Tags()
{
    return $this->hasMany('App\Tags ','link_id','id');
}