0

カスタムarrayadapterとカスタムレイアウトのリストビューがあり、チェックボックスがあります。このリストビューのチェックボックスを 1 つだけ有効にしたいのですが、どうすればよいかわかりません。

これは私のアダプターですが、チェックとチェック解除がうまくいきません。例を教えてください。

public class gremioAdapter extends ArrayAdapter<Gremio> {

Context context;
int layoutResourceId;
ArrayList<Gremio> data = null;
protected String comentarioAlEdiText;

public gremioAdapter(Context context, int layoutResourceId, ArrayList<Gremio> data)
{
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

public void updateDataSet(Gremio objetoGremioAnadir) {
    this.data.add(objetoGremioAnadir);
    notifyDataSetChanged();

}

public void updateDataSet(Gremio objetoGremioAnadir, int posicion) {
    this.data.add(posicion, objetoGremioAnadir);
    notifyDataSetChanged();

}

public void updateDataSet(String comentario, int posicion) {
    this.data.get(posicion).comentario = comentario;
    notifyDataSetChanged();

}
public void updateDataSet() {

    notifyDataSetChanged();

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;
    GremioHolder holder = null;
    final GremioHolder h2 = holder;


    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new GremioHolder();
        holder.tvGremio = (TextView) row.findViewById(R.id.tvGremio);
        holder.cbActivo = (CheckBox) row.findViewById(R.id.cbGremioActivo);
        holder.tvComentario = (TextView) row.findViewById(R.id.tvComentario);

        row.setTag(holder);
    }
    else {
        holder = (GremioHolder) row.getTag();
    }

    Gremio gremioFinal = data.get(position);

    holder.tvGremio.setText(gremioFinal.literal);
    holder.tvComentario.setText(gremioFinal.comentario);

    if (data.get(position).getActivo().equals("1")) {
        holder.cbActivo.setChecked(true);
    }
    else {
        holder.cbActivo.setChecked(false);
    }

    holder.cbActivo.setOnClickListener(new OnClickListener()
    {


        @Override
        public void onClick(View v) {
            if (data.get(position).activo.equals("0"))
                h2.cbActivo.setChecked(true);
            if (data.get(position).activo.equals("1"))
                h2.cbActivo.setChecked(false);

        }
    });
    holder.cbActivo.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (!isChecked) {
                    for (int i = 0; i < data.size(); i++) {
                        data.get(i).activo = "0";
                    }
                    data.get(position).activo = "1";
                }
                if (isChecked) {
                    for (int i = 0; i < data.size(); i++) {
                        data.get(i).activo = "0";
                    }
                }

                notifyDataSetChanged();

            }
        });

        return row;
    }

    public class GremioHolder {
        TextView tvGremio;
        CheckBox cbActivo;
        TextView tvComentario;
    }
}

}
4

2 に答える 2

1

これで要件が満たされるはずです。これを達成する方法についての非常に優れたチュートリアルです。

http://tokudu.com/2010/android-checkable-linear-layout/

したがって、基本的な根拠は次のとおりです。

  1. レイアウト (リニア/相対) を拡張し、チェック可能なインターフェイスを実装します。
  2. レイアウトを膨張させた後、選択された子を見つけて、対応するチェックボックスをオンにします。以前にチェックした他の項目のチェックを外します。
  3. ListView の XML に [android:choiceMode="singleChoice"] とマークされていることを確認してください。
于 2012-07-16T09:37:54.327 に答える
0

それはあなたにとって便利です... getview() メソッドを変更するだけです。

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        final Holder holder;
        if (vi == null) {
            vi = inflater.inflate(R.layout.raw_customelabel_list, null);
            holder = new Holder();

            holder.txtname = (TextView) vi
                    .findViewById(R.id.raw_customlabel_txt_name);
            holder.checkbox = (CheckBox) vi
                    .findViewById(R.id.raw_customlabel_checkbox);
            vi.setTag(holder);

        } else {
            holder = (Holder) vi.getTag();
        }

        vi.setTag(holder);
        holder.txtname.setText(strarry[position]);

        holder.checkbox.setId(position);
        holder.checkbox.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < strarry.length; i++) {
                    if (v.getId() == i) {
                        checkarry[i] = true;
                        Log.v("check", ""+position);
                    } else {
                        checkarry[i] = false;
                    }
                }
                notifyDataSetChanged();
            }
        });

        if (checkarry[position]) {
            holder.checkbox.setChecked(true);
        } else {
            holder.checkbox.setChecked(false);
        }

        return vi;
    }

}
于 2012-09-29T12:36:49.293 に答える