简体   繁体   English

将项目值保存在Recycler View对象Android中

[英]Save item values in recycler view object android

I am working in recycler view where I have increment and decrement buttons. 我在回收站视图中工作,这里有递增和递减按钮。 My condition is that maximum I can't add 10 and minimum 0. When I am clicking on increment button of 1st row item in recycler view it is adding 1, but when I am clicking on 2nd row item in recycler view it is affecting first item of list as well. 我的条件是最大不能加10,最小不能加0。当我单击“回收者”视图中第一行项目的增量按钮时,它增加1,但是当我单击“回收者”视图中第二行项目时,它首先影响列表项。 Lets say item1 becomes 1 plus. 假设item1变成1加号。

when I am doing any increment and decrement, it should not affect other row items in RecyclerView. 当我执行任何递增和递减操作时,它不应影响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+"");
                    }
                }
         });
     }
 }

When decrementing from item 1, it is decrementing value in row item2 as well. 从项目1递减时,它也在行item2中递减值。 I want to keep the values per item. 我想保留每个项目的值。

在此处输入图片说明

在此处输入图片说明

you are getting trouble because off global variable counter. 您遇到了麻烦,因为偏离了全局变量计数器。 Instead of counter use private HashMap<Integer,Integer>counterMap=new HashMap<>(); private int counter=0; 而不是使用private HashMap<Integer,Integer>counterMap=new HashMap<>(); private int counter=0; private HashMap<Integer,Integer>counterMap=new HashMap<>(); private int counter=0;

and your onclickeListener method will be like this 并且您的onclickeListener方法将如下所示

((MemberViewHolder) holder).txtIncrement.setOnClickListener(new TextView.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(counterMap.containsKey(position)) 
            counter =counterMap.get(position);
            else counter=0
            counter++;
            counterMap.put(position,counter)

            ((MemberViewHolder) holder).txtCounter.setText(counter+"");

        }
    });

I recommend to use a map for this. 我建议为此使用地图。

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

The key is the position of the item in your adapter. 关键是项目在适配器中的位置。 The value is the count of items for that position. 该值是该职位的项目数。

So inside your onBindViewHolder() you have to do some changes: 因此,在onBindViewHolder()内部,您必须进行一些更改:

For incrementing: 对于递增:

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

For decrementing: 对于递减:

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

Initialize your map with count 0 for each item in the contructor of your adapter. 初始化适配器的构造器中每个项目的计数为0的地图。

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

Here is how I did it: 这是我的做法:

First create a member variable of type int[] 首先创建一个类型为int []的成员变量

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

Here i have given the array a default size of 10 . 在这里,我给数组的默认大小为10。

Important: This will crash your app if you try to increment item above index 10. To avoid that you need to give it the size of your arrayList when you populate the arrayList (possible in the adapter constructor). 重要说明: 如果您尝试将项目增加到索引10之上,这将使您的应用程序崩溃。为避免在填充arrayList(在适配器构造函数中可能)时需要给它提供arrayList的大小。

Now in your onBindViewHolder() : 现在在您的 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]+"");

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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