java - (动态布局)我的 View 中的按钮监听器更新多个 TextView 而不是 1

标签 java android

我尝试 Android 两周了,但遇到了一些问题。 我有一个从数据库中获取的汉堡列表,我用它做了一个 View 。 该应用程序需要增加和减少用户想要的数量,以便他可以传递订单。 enter image description here 我的问题是,当我单击 + 按钮时,应用程序会更新多个 TextView ,但我不明白它来自哪里以及如何修复它。

这是我的 View 代码示例:

package com.example.fastfood;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;

public class BurgerAdapter extends ArrayAdapter<Burger> {
    public BurgerAdapter(Context context, ArrayList<Burger> burgers) {
        super(context, 0,burgers);
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final Burger burger = getItem(position);
        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_burger, parent, false);
        }
        TextView burgerName = (TextView) convertView.findViewById(R.id.burgerName);
        TextView burgerPrice = (TextView) convertView.findViewById(R.id.burgerPrice);
        TextView qteCmd = (TextView) convertView.findViewById(R.id.qteCmd);
        Button btnMoins = (Button) convertView.findViewById(R.id.moins);
        Button btnPlus = (Button) convertView.findViewById(R.id.plus);
        btnMoins.setTag(qteCmd);
        btnPlus.setTag(qteCmd);
        btnMoins.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView qteCmd = (TextView) v.getTag();
                burger.changeQuantitee(-1);
                Log.d("DEBUG", "Button moins : "+burger.getNom()+" "+burger.getQuantitee()+" "+qteCmd.getId());
                qteCmd.setText(Integer.toString(burger.getQuantitee()));
            }
        });

        btnPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView qteCmd = (TextView) v.getTag();
                burger.changeQuantitee(1);
                Log.d("DEBUG", "Button moins : "+burger.getNom()+" "+burger.getQuantitee()+" "+qteCmd.getId());
                qteCmd.setText(Integer.toString(burger.getQuantitee()));
            }
        });
        burgerName.setText(burger.getNom());
        burgerPrice.setText(burger.getPrix()+"€");
        return convertView;
    }
}

最佳答案

您不应该在不属于 Adapter 类的方法内更改 AdapterView(ListView、Spinner、RecyclerView 等)的 View (就像您对 onClick() 方法重写所做的那样。什么您应该做的是在更改数据模型后使用 .notifyDataSetChanged() 通知适配器。

此外,我强烈建议您不要在 onClick() 中捕获局部变量 Burger。相反,使用适配器位置从 BurgersList 获取数据。所以你的代码就像:

 btnMoins.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView qteCmd = (TextView) v.getTag();
                Burger b = getItem(position);
                b.changeQuantitee(-1);
                Log.d("DEBUG", "Button moins : "+burger.getNom()+" "+burger.getQuantitee()+" "+qteCmd.getId());

               //Instead of changing the state of the TextView yourself, you should instead do following:
                BurgerAdapter.this.notifyDataSetChanged();
            }
        });

关于java - (动态布局)我的 View 中的按钮监听器更新多个 TextView 而不是 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62386604/

相关文章:

java - 执行 ON DUPLICATE KEY UPDATE v=v 时,MySql java 驱动程序返回 1

java - import com.google.android.gms.location.LocationClient无法解析

android - 让 Android 使用新的音频 HAL 需要什么

android-layout - 当我打开微调器时,沉浸式全屏模式(粘性标志)被禁用

java - Spring Webapp 与 Hibernate、注解驱动、一个又一个问题、源代码链接

java - hibernate 5.0.1 和 Java 8;找不到提供者 org.hibernate.type.Java8DateTimeTypeContributor

java - Android 应用程序和网络小程序是否有通用接口(interface)?

java - 如何使用 Jsoup 添加新的 html 标签?

android - 无法在 Android 中使用trigger.io 和 parse.com 接收推送通知

java - Sun Java System Application Server 9.1_02(内部版本 b04-fcs)上的 HTTP 状态 503