当前位置: 首页 > 知识库问答 >
问题:

onBindViewHolder只为我在recyclerview中单击的第一个元素调用

蔚元明
2023-03-14

我有一个片段,其中有recyclerview,并为其设置了适配器。如果我点击第一个添加到购物车,然后点击第二个。之后,当片段重新启动时,只有“第一次添加到购物车”的状态才会更改。同样地,如果我在重启后单击recyclerview中的第一个添加到购物车元素,则只有第二个添加到购物车的状态被更改。我想调用从0到适配器中最后一个元素的onBindViewHolder位置。在ViewHolder类中,有一个Add_to_cart change监听器。

public void onBindViewHolder(@NonNull final MilkAdapter1.ViewHolder holder, int position) {
    // I need to call this method for all elements in recyclerview whenever restarted 
    if (c != null && c.moveToFirst()) {
        do {
            for (int i = 0; i < list.size(); i++) {
                if (name.equals(holder.product_name.getText().toString())) {  // if present just update the AddToCart status
                   // if add_to_cart element is present in sqlite Database, just update its status
                    holder.textView.setVisibility(View.GONE); // this will change the Add to Cart status
                    holder.linearLayout.setVisibility(View.VISIBLE);
                    holder.digit.setText(quantit + "");
                }
            }
        } while (c.moveToNext());
        c.close();
    }

}

抱歉,我不能上传图片到我的应用程序,因为较少的声誉。

共有2个答案

夏法
2023-03-14

假设您正在将所选项目存储在ArrayList中(如果您不这样做,我建议您这样做),解决方案是:

public void onBindViewHolder(@NonNull final MilkAdapter1.ViewHolder holder, int position) {
    // I need to call this method for all elements in recyclerview whenever restarted 
    if (c != null && c.moveToFirst()) {
        do {
            if (nameArrayList.contains(holder.product_name.getText().toString())) {  // if present just update the AddToCart status
                   // if add_to_cart element is present in sqlite Database just update its status
                holder.textView.setVisibility(View.GONE); // this will change the Add to Cart status
                holder.linearLayout.setVisibility(View.VISIBLE);
                holder.digit.setText(quantit + "");
            }
        } while (c.moveToNext());
        c.close();
    }
}

正如Sachin Soma所指出的,您不需要为循环调用,因为列表中的每个项目都会调用一次onBindViewHolder

谭凯
2023-03-14

你可以实现这个使用位置不要使用for循环...

@Override
    public int getItemCount() {
        return list.size();
    }


public void onBindViewHolder(@NonNull final MilkAdapter1.ViewHolder holder, int position) {
    // I need to call this method for all elements in recyclerview whenever restarted 
    if (c != null && c.moveToFirst()) {
        do {

                if (name.equals(holder.product_name.getText().toString())) {  // if present just update the AddToCart status
                   // if add_to_cart element is present in sqlite Database just update its status
                    holder.textView.setVisibility(View.GONE); // this will change the Add to Cart status
                    holder.linearLayout.setVisibility(View.VISIBLE);
                    holder.digit.setText(quantit + "");

            }
        } while (c.moveToNext());
        c.close();
    }

}
 类似资料:
  • 如何使用XPath点击下面的“确定”按钮: 截图:

  • 我是java函数编程的新手,不知道如何编写代码来避免(例如)此操作中的NPE: 我在这里的目的是在列表中查找最新对象的时间戳。关于如何更好地收集最后一个元素的建议非常受欢迎,但我在这里的主要问题实际上是为什么这有效。 文档显示,如果归约的结果为空,该函数将抛出< code > NullPointerException : http://docs . Oracle . com/javase/8/do

  • 我有一个具有多个视图类型的viewholder。 滚动时,只有当更改值时,才会调用onBindViewHolder。这会导致我的列表项无法正确更新。 这是虫子吗?或者我做错了什么。从新的类来看,这似乎是非常奇怪的行为。 这是我的适配器: 我还提取了如下内容: 对于部分 它对第一个可见行运行良好,但随后失败。

  • 输出8 好吧,我给出了 neg=-1,low=0、b=10、键盘=2、驱动器=3 的值,我的数组是 [3 1] [5 2 8] 我已经添加了键盘和驱动器值,将其存储在max数组中。当我将这些最大数组值与b if(max[i]进行比较时

  • 问题内容: 我正在使用“替换”功能删除div中的所有非数字值。 看来Jquery replace只影响第一个元素。 这是我的Jquery: HTML代码: 结果: 2011 c20ff113。c201gf76341。 我想要的结果是: 2011 20113 20176341 问题答案: 您有重复的ID,这是无效的,并且还有jQueryID选择器(或jQuery内部使用的任何其他ID选择器,例如do

  • 问题内容: 现在,我有一个div,它基本上是一个巨大的正方形,在div内,我还有另一个div,它是简单的文本,上面写着“ Upload File”,同时还有一个隐藏的input type = file元素。当用户按下div时,我要触发文件上传元素。到目前为止,我想出的代码是: 因此,我在CSS中将文件输入元素设置为。一旦他们在div id =“ test”中的任意位置单击,我想触发对文件上传元素的