如何通过内部 Button.setOnClickListener 操作内部 EditText 的值

How to manipulate value of a inner EditText by a inner Button.setOnClickListener

我有一个扩展 ArrayAdapter Class,它在 getView 函数中为每个列表项膨胀一个带有 EditText 和 Button 的布局我需要当按下 Button 时 EditText 的值会增加,我正在尝试这个代码:

@Override
    public View getView(int position, final View convertView, ViewGroup parent) {

        View item = convertView;
        if (item == null){
            LayoutInflater inflater =  LayoutInflater.from(getContext());
            item = inflater.inflate(R.layout.lista_clientes, null);
        }

        TextView p = (TextView)item.findViewById(R.id.txtProd);
        Button bMas = (Button)item.findViewById(R.id.btnMas);
        Button bMen = (Button)item.findViewById(R.id.btnMenos);

        EditText txtCant = (EditText) item.findViewById(R.id.txtCantidad);
        bMas.setOnClickListener(new View.OnClickListener() {
            Integer n = 0;

            @Override
            public void onClick(View v) {
                n++;
                txtCant.setText(String.valueOf(n));//ERROR (txtCant)
            }
        });

        p.setText(datosProd.get(position).getProducto());
        return item;
    }

但这会产生错误:"variable txtCant is accessed from within inner class needs to be declareted final" 如果我这样做(声明 fina),我将无法使用 setText。我如何解决这个问题?

如果您需要增加每个网格项目的计数,请在某处设置一个全局变量,并在每次按下相应位置的按钮时增加该变量。

例如

Config.java file:

在这里为每个项目声明一个变量(如果你知道有多少项目将被填充)。

    public class Config {


    public static final int countItem1=0;
    public static final int countItem2=0;
    public static final int countItem2=0;
}

现在在按钮的 onClick 上,检查位置和相应的值并增加它。

例如

    @Override
                public void onClick(View v) {
                    switch(position)
                   {
                         case 0:
                         int n=Config.countitem1;
                         txtCant.setText(String.valueOf(n+1);
                         Config.countItem1++;
                         break;
                         .....


                         .....
                   }
                }
            });

或者,您可以简单地在网格的 onItemClickListener 上应用逻辑。将网格中的项目设为 focusable=false.

编辑:

我正在添加一个扩展 BaseAdapter 的示例适配器 class。 我添加了你的变量名和所有。让我知道它是否有效。

public class CustomListAdapterList extends BaseAdapter {
    private ArrayList<xyz> listData;
    private LayoutInflater layoutInflater;
    Context context;
    boolean state;
    public CustomListAdapterRList(Context aContext, ArrayList<xyz> listData) {

        this.listData = listData;
        this.context = aContext;
        layoutInflater = LayoutInflater.from(aContext);

    }
    @Override
    public int getCount() {
        return listData.size();
    }
    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        View v=convertView;
        if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.grid_dish_single, null);
                holder = new ViewHolder();
                holder.p = (TextView) convertView.findViewById(R.id.txtProd);
                holder.txtCant = (EditText) convertView.findViewById(R.id.txtCantidad);
                holder.bMen = (Button) convertView.findViewById(R.id.btnMas);
                holder.bMas = (Button) convertView.findViewById(R.id.btnMenos);
                convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.bMas.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                state=holder.bMas.isSelected();

                if(!state) {
                        int n=Integer.valuesOf(holder.txtCant.getText().toString().trim());
                        holder.txtCant.setText(String.valueOf(n+1));


                }

        return convertView;
    }

    static class ViewHolder {
        TextView p;
        EditText txtCant ;
        Button bMas ;
        Button bMen;
    }
}