0

私はListView独自のアダプターを持っています: CityZipCodesAdapter. コンストラクターで、 、、および(が選択されているかどうか)List<CityZipCodesDataModel>を保持する場所を指定します。これを書き込んでから、これを読みます。それはすべて機能します。StringStringboolenRadioButtonSharedPreferences

public class CityZipCodesAdapter extends ArrayAdapter<CityZipCodesDataModel> {

    private final List<CityZipCodesDataModel> list;
    private final Activity context;
    private RadioButton selectedRB;

    private int selectedPosition = -1;

    public CityZipCodesAdapter(Activity context,
            List<CityZipCodesDataModel> list) {
        super(context, R.layout.city_list_item, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView cityOrZipCode;
        protected TextView listOfZipCodesInNear;
        protected RadioButton radioBtn;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ViewHolder viewHolder = null;
        if (view == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.city_list_item, null);
            viewHolder = new ViewHolder();
            viewHolder.cityOrZipCode = (TextView) view.findViewById(R.id.cityOrZipCode);
            viewHolder.listOfZipCodesInNear = (TextView) view.findViewById(R.id.listOfZipCodesInNear);


            viewHolder.radioBtn = (RadioButton)view.findViewById(R.id.radioButton);
            view.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) view.getTag() ;
        }

        viewHolder.radioBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(position != selectedPosition && selectedRB != null){
                    selectedRB.setChecked(false);
                }

                selectedPosition = position;
                selectedRB = (RadioButton)v;
            }
        });


        if(selectedPosition != position){
            viewHolder.radioBtn.setChecked(false);
        }else{
            viewHolder.radioBtn.setChecked(true);
            if(selectedRB != null && viewHolder.radioBtn != selectedRB){
                selectedRB = viewHolder.radioBtn;
            }
        }

        viewHolder.listOfZipCodesInNear.setText(list.get(position).getZipCodes());
        viewHolder.cityOrZipCode.setText(list.get(position).getLocation());

        viewHolder.radioBtn.setText(list.get(position).getLocation());
        viewHolder.radioBtn.setChecked(list.get(position).isSelectedLocation());

        return view;
    }
}

問題は、アプリケーションをオンにすると、正しいものRadioButtonが選択されますが、アクティブではありません。正しく表示されているだけです。例えば、

×ストリング1

o 文字列 2

o String3

String2 をクリックすると (String1 が最初に選択されました)、String2 が選択されますが、String1 も選択されます。String1、次に String2 をクリックすると、選択は正しいです。

何が悪いのか分かりますか?助けてくれて本当にありがとうございます!

4

2 に答える 2

1

問題はコードのこの部分にあると思います:

if(selectedPosition != position){
        viewHolder.radioBtn.setChecked(false);
    }else{
        viewHolder.radioBtn.setChecked(true);
        if(selectedRB != null && viewHolder.radioBtn != selectedRB){
            selectedRB = viewHolder.radioBtn;
        }
    }

最初はselectedPosition != positionsoselectedRBは設定されず、null のままです。最初に最初のラジオボタンをクリックすると、設定されて機能しますが、そうしないと、コードは選択を解除しません。

于 2013-10-01T23:59:49.340 に答える
1

クリック可能な状態を表示するラジオ ボタンを 1 つだけにしたい場合は、他のボタンを手動で削除する必要があります。

オンクリック...

 radio2.setChecked(true);
    radio1.setChecked(false);
     radio3.setChecked(false);

それ以外の場合は、設定したいものを設定しますが、他のものはキャンセルしません...それらがすべて同じ位置にある場合...それは簡単なはずです...

他の位置を変更する限り、あなたがしたことがうまくいくとは思いません...クリックするたびに、リストビューを再構築し、位置を変更するたびに...またはnotifyDataSetChanged()そのようなものを使用する必要があると思います...

あなたのためにこれを見つけました

CheckBox の単一選択によるカスタム リストビュー

役立つと思います...

于 2013-10-01T23:52:46.770 に答える