Слушатель кнопок внутри списка дает неожиданные результаты

public class CustomerProductAdapter extends BaseAdapter {
Context ccon;
ImageView cprdctimg;

LayoutInflater cprdctinflater;
View cprdctview;
TextView cprdctname,cprdctdesc,cprdctprice,cprdctquant,cpquantity;
ArrayList<Product> cproduct;
Product currentproduct;
Button cpincq,cpdecq;
@Override
public int getCount() {
    return cproduct.size();
}

@Override
public Object getItem(int i) {
    return cproduct.get(i).getPname();
}

public CustomerProductAdapter(Context con,ArrayList<Product> product) {
    this.cproduct=product;
    this.ccon = con;
    cprdctinflater=LayoutInflater.from(con);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, final ViewGroup viewGroup) {
    cprdctview=cprdctinflater.inflate(R.layout.cplist,null);
    cpincq=cprdctview.findViewById(R.id.cpincq);
    cpquantity=cprdctview.findViewById(R.id.cpquantity);
    cpdecq=cprdctview.findViewById(R.id.cpdecq);
    cprdctname=cprdctview.findViewById(R.id.cpname);
    cprdctdesc=cprdctview.findViewById(R.id.cpdesc);
    cprdctimg=cprdctview.findViewById(R.id.cppic);
    cprdctprice=cprdctview.findViewById(R.id.cpprice);
    cprdctquant=cprdctview.findViewById(R.id.cpquant);

    currentproduct=cproduct.get(i);
    cprdctimg.setImageResource(cproduct.get(i).getPimage());
    cprdctname.append(cproduct.get(i).getPname().toString());
    cprdctdesc.append(cproduct.get(i).getPdesc().toString());
    cprdctprice.append(cproduct.get(i).getPprice().toString());
    cprdctquant.append(cproduct.get(i).getPquant());

    cpincq.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            currentproduct.inccustomerquantity();
            if (currentproduct.getcustomerquantity()>Integer.parseInt(currentproduct.getPquant()))
            {
                Toast.makeText(viewGroup.getContext(), "You cannot order more than stock", Toast.LENGTH_SHORT).show();
                currentproduct.deccustomerquantity();
            }
            else {
                cpquantity.setText("" + currentproduct.getcustomerquantity());
            }
        }
    });
    cpdecq.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (currentproduct.deccustomerquantity()) {
                cpquantity.setText("" + currentproduct.getcustomerquantity());
            }
        }
    });

    return cprdctview;
}
}

Здесь, если я увеличиваю количество одного продукта в списке, соответствующий TextView не изменяется, а изменяется какой-то другой TextView в другом элементе списка. Как вы можете видеть на изображении, количество винограда меняется, когда я нажимаю на символ «+» в банане. Пожалуйста, помогите мне исправить эту ошибку, чтобы изменения были внесены только в соответствующее текстовое представление.

Слушатель кнопок внутри списка дает неожиданные результаты

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
42
3

Ответы 3

Когда вы нажимаете кнопку, вам нужно изменить модель в списке, а не пользовательский интерфейс. После этого обновите нужное положение адаптера. Предлагаю вам взглянуть на шаблон ViewHolder.

Я обновил модель, как вы сказали. Смотрите строку currentproduct.inccustomerquantity();. Что вы имеете в виду, обновляя желаемое положение адаптера. Я обновил модель. Но как обновить адаптер. Не могли бы вы привести пример.

akshay 10.08.2018 17:09

GetView () вызывается каждый раз при создании строки. Поэтому ваши глобальные переменные / переменные экземпляра (currentproduct, cprdctname, cprdctdesc ...) всегда относятся к последней созданной строке (при прокрутке вверх - к нижней; при прокрутке вниз - к верхней). Вы можете сохранить позицию строки элемента как Ярлык для кнопок и обновить соответствующий элемент в списке данных. Затем вызовите адаптер для перерисовки всех строк с помощью notifyDataSetChanged ().

Попробуй это:

@Override
public View getView(int i, View view, final ViewGroup viewGroup) {
cprdctview=cprdctinflater.inflate(R.layout.cplist,null);
cpincq=cprdctview.findViewById(R.id.cpincq);
cpquantity=cprdctview.findViewById(R.id.cpquantity);
cpdecq=cprdctview.findViewById(R.id.cpdecq);
cprdctname=cprdctview.findViewById(R.id.cpname);
cprdctdesc=cprdctview.findViewById(R.id.cpdesc);
cprdctimg=cprdctview.findViewById(R.id.cppic);
cprdctprice=cprdctview.findViewById(R.id.cpprice);
cprdctquant=cprdctview.findViewById(R.id.cpquant);

currentproduct=cproduct.get(i);
cprdctimg.setImageResource(cproduct.get(i).getPimage());
cprdctname.append(cproduct.get(i).getPname().toString());
cprdctdesc.append(cproduct.get(i).getPdesc().toString());
cprdctprice.append(cproduct.get(i).getPprice().toString());
cprdctquant.append(cproduct.get(i).getPquant());

cpincq.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        currentproduct = cproduct.get((int)view.getTag()); // Get item for the clicked position
        currentproduct.inccustomerquantity();
        if (currentproduct.getcustomerquantity()>Integer.parseInt(currentproduct.getPquant()))
        {
            Toast.makeText(viewGroup.getContext(), "You cannot order more than stock", Toast.LENGTH_SHORT).show();
            currentproduct.deccustomerquantity();
        }
        else {
            //cpquantity.setText("" + currentproduct.getcustomerquantity());
            notifyDataSetChanged();
        }
    }
});
cpdecq.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        currentproduct = cproduct.get((int)view.getTag()); // Get item for the clicked position
        if (currentproduct.deccustomerquantity()) {
            //cpquantity.setText("" + currentproduct.getcustomerquantity());
            notifyDataSetChanged();
        }
    }
});

// Save the current position as Tag to the buttons
cpincq.setTag(i);
cpdecq.setTag(i);

return cprdctview;
}

Надеюсь, это поможет!

Согласно официальной документации Android, не используйте позицию, поскольку она используется повторно. Рекомендуется использовать getAdapterPosition (). Итак, в вашем коде вместо listOfItems.get (i) используйте listOfItems (getAdapterPosition ())

Другие вопросы по теме