1

1つのテキストと1つのチェックボックスでリストビューを視覚化する必要があるカスタム配列アダプターを実装しようとしています。選択を覚えておく必要があります。1つのオプションがチェックされるたびに、他のすべてのオプションがラジオボタンとしてオフになるようにします。

これは私のコードです

public class RAnswerAdapter extends ArrayAdapter<RAnswer> {

private final ArrayList<RAnswer> list;
private final Activity context;

public RAnswerAdapter(Activity context, ArrayList<RAnswer> list) {
    super(context, R.layout.answer_item, list);
    this.context = context;
    this.list = list;
}

static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.answer_item_radio, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.answerName);
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkAnsw);

        viewHolder.checkbox
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        Answer element = (Answer) viewHolder.checkbox.getTag();

                        for(Answer a: list)
                            //if true
                            if(a.isSelected())
                                //I set at false
                                a.setSelected(false);

                        //I set the new at true
                        element.setSelected(buttonView.isChecked());    

                        //I refresh the list
                        notifyDataSetChanged();
                    }
                });



        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));
    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getAnswer_option());
    holder.checkbox.setChecked(list.get(position).isSelected());
    return view;
}

}

コードは実際には奇妙な方法で機能します...リストの最初の4つの要素は完全に機能し、他のすべての要素はチェックできません!なぜこれ?エラーはどこにありますか?

助けてくれてありがとう

4

2 に答える 2

0

自分でデバッグできずに、コードの問題を特定するのに苦労しています。アダプターに変数を追加して、現在チェックされているアイテムのインデックスを保存することをお勧めします。これによりlist、クリックするたびに検索する必要がなくなります。また、onCheckChanged() に if ステートメントを追加して、回答が既にチェックされている場合 (現在のように動作するように) にアクションを実行しないようにするか、ユーザーが現在の回答をチェック解除できるようにします。

ListView の ChoiceMode オプションを自分でプッシュするには、次のように提示します。

public class Example extends Activity implements OnItemClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String[] array = {"one", "two", "three"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, array);

        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(this);
    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.v("Example", "ItemClick: " + ((ListView) parent).getCheckedItemPosition());
    }
}

このアプリは短くて甘いです。独自のレイアウトを設計してアダプターに渡すことができます。現在のチェックボックスの例を次に示します。また、チェックされた行の位置 (または ID またはテキスト) をいつでも参照できます。すべての回答をデータベースに保存することもできます。

これらのいずれかが役立つかどうか教えてください。

于 2012-05-14T16:40:30.730 に答える
0

ここStackOverflowのこの便利な投稿を見る必要があると思います。見てみると、私が作成したチュートリアルへのリンクがあり、それが問題の解決策になる可能性があります;)

Link CheckedListView

于 2012-05-11T23:19:05.973 に答える