0

各行にボタンを含むリストビューがあります。

このボタンをクリックすると、単一の値を選択するためのダイアログが開きます。

リストを下に移動すると、ボタンの値が移動します。最初の値は 8 行ごとに繰り返されます。

ここに私の getView() コードがあります:

public static class ViewHolder {
    public Button listaCerrada;
}


    public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    try {
        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater vi = (LayoutInflater) ctx
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.row_lista_form, null);

            holder.listaCerrada = (Button) convertView
                    .findViewById(R.id.listaCerrada);
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.listaCerrada.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Get list Values
                String datoValido = metrica.getlForms().get(position)
                        .getProducto().getDatoValido();
                AlertDialog.Builder adb = new AlertDialog.Builder(ctx);
                // HAY:HAY;NO HAY:NO HAY
                String[] parts = datoValido.split(";");
                ArrayList<String> values = new ArrayList<String>();
                for (String s : parts) {
                    String[] part2 = s.split(":");
                    values.add(part2[0]);
                }

                final CharSequence[] items = values
                        .toArray(new CharSequence[values.size()]);

                adb.setSingleChoiceItems(items, 0,
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.dismiss();

                                holder.listaCerrada.setText(items[which]);
                            }

                        });
                adb.setNegativeButton("Cancelar", null);


                adb.show();

            }
        });


    } catch (Exception e) {
        e.printStackTrace();
    }
    return convertView;
}
4

2 に答える 2

1

ビューは再利用されるため、convertView == null の場合にのみ OnClickListener を設定してください。次の更新されたコードを参照してください。

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    try {
        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater vi = (LayoutInflater) ctx
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.row_lista_form, null);

            holder.listaCerrada = (Button) convertView
                    .findViewById(R.id.listaCerrada);
            }

            holder.listaCerrada.setOnClickListener(new OnClickListener() {

               @Override
               public void onClick(View v) {
                  // Get list Values
                  String datoValido = metrica.getlForms().get(position)
                        .getProducto().getDatoValido();
                  AlertDialog.Builder adb = new AlertDialog.Builder(ctx);
                  // HAY:HAY;NO HAY:NO HAY
                  String[] parts = datoValido.split(";");
                  ArrayList<String> values = new ArrayList<String>();
                  for (String s : parts) {
                     String[] part2 = s.split(":");
                     values.add(part2[0]);
                  }

                  final CharSequence[] items = values
                        .toArray(new CharSequence[values.size()]);

                  adb.setSingleChoiceItems(items, 0,
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                  int which) {
                               dialog.dismiss();

                               holder.listaCerrada.setText(items[which]);
                            }

                        });
                  adb.setNegativeButton("Cancelar", null);


                  adb.show();

               }
            });

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return convertView;
}
于 2014-07-23T16:17:51.933 に答える