【问题标题】:Save item values in recycler view object android在回收站视图对象android中保存项目值
【发布时间】:2018-04-12 11:30:34
【问题描述】:

我在回收站视图中工作,其中有递增和递减按钮。我的条件是最大我不能添加 10 和最小 0。当我在回收器视图中单击第一行项目的增量按钮时,它正在添加 1,但是当我在回收器视图中单击第二行项目时它首先影响列表项也是如此。假设 item1 变为 1 plus。

当我进行任何递增和递减时,它不应该影响 RecyclerView 中的其他行项。

int counter = 0;

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder  holder,final int position) {
    final ParseObject parseObject = arrayList.get(position);
    boolean like = true, dislike = true;
    if (holder instanceof MemberViewHolder) {
        if (arrayList.size() > 0) {
            ((MemberViewHolder) holder).txtIncrement.setOnClickListener(new TextView.OnClickListener() {
                @Override
                public void onClick(View view) {
                            counter += 1;
                            ((MemberViewHolder) holder).txtCounter.setText(counter+"");
                    }
            });
            ((MemberViewHolder) holder).txtDecrement.setOnClickListener(new TextView.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if(counter == 0){

                    }else{
                        counter -= 1;
                        ((MemberViewHolder) holder).txtCounter.setText(counter+"");
                    }
                }
         });
     }
 }

当从第 1 项递减时,它也在递减第 2 行中的值。我想保留每个项目的值。

【问题讨论】:

  • 发布您的 onBindViewHolder 代码
  • 维护一个计数器数组,大小等于您的数据集大小,在 decrement 和 increment 时更新该索引计数,参考该数组以进行 UI 更新
  • @RahulChaudhary 感谢您的回复。我正在更新我的完整 onBindViewHolder。请在上面检查。
  • @VinaySasalatti 感谢您的回复。你能按照你的解释给我一个代码sn-p吗?我已经编辑了我上面的 onBindViewHolder,你也可以检查一下。
  • 你有没有一个recyclerview_object列表来分别处理每个项目

标签: android android-recyclerview increment


【解决方案1】:

我建议为此使用地图。

private Map<Integer, Integer> countOfItems = new HashMap<>();

关键是适配器中项目的位置。该值是该位置的项目数。

因此,在您的 onBindViewHolder() 中,您必须进行一些更改:

对于递增:

int currentCount = countOfItems.get(position);
currentCount++;
countOfItems.put(position, currentCount);

对于递减:

int currentCount = countOfItems.get(position);
if(currentCount > 0) {
  currentCount--;
  countOfItems.put(position, currentCount);
}

使用适配器构造函数中的每个项目的计数 0 来初始化您的地图。

for(int i = 0; i < arrayList.size(); i++) {
  countOfItems.put(i, 0)
}

【讨论】:

  • 感谢您的回答。我已经运行了这段代码,它在 counter =counterMap.get(position); 上给出了 null 异常;在调试器上我检查了它,它给出了 position = 0 和 counterMap = 0 并且在 counterMap.get(position) 上给出了空指针异常。
  • 请帮我解决这个问题
  • 您是在适配器构造函数中传递arrayList,还是在其他地方设置arrayList
  • 这是我的默认数字计数器。我的意思是我正在制作从 0 到 10 的数字来进行加减运算。我没有从服务器获取这 0 到 10 个值。
  • @beep 如果我按下加/减按钮,我只想显示 0-10 个值。并且该值应该是 Per Item,它不应该影响其他行项值。
【解决方案2】:

我是这样做的:

首先创建一个int[]类型的成员变量

private int[] counter = new int[10];

这里我给数组的默认大小是 10。

重要提示:如果您尝试将项目增加到索引 10 以上,这将导致您的应用程序崩溃。为避免您需要在填充 arrayList 时为其指定 arrayList 的大小(可能在适配器构造函数中)。

现在在您的onBindViewHolder()

((MemberViewHolder) holder).txtIncrement.setOnClickListener(new TextView.OnClickListener() {
        @Override
        public void onClick(View view) {

                    counter[position] += 1;
                    ((MemberViewHolder) holder).txtCounter.setText(counter[position]+"");

        }
    });
    ((MemberViewHolder) holder).txtDecrement.setOnClickListener(new TextView.OnClickListener() {
        @Override
        public void onClick(View view) {

            if(counter[position] == 0){

            }else{
                counter[position] -= 1;
                ((MemberViewHolder) holder).txtCounter.setText(counter[position]+"");
            }
        }
    });                                                   
    ((MemberViewHolder) holder).txtCounter.setText(counter[position]+"");

希望这会有所帮助!

【讨论】:

  • 感谢您的回答。您的解决方案非常适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多