0

ArrayAdapterで構築されたカスタムlistViewがあります。ListViewでは、各項目の内容はTextViewRadioGroup (4 つのRadioButtonを含む) です。リスト項目ごとに選択するRadioButtonを1 つ選択できます。ListViewの下部に、ボタン付きのフッターがあります。私が欲しいのは、次のようなボタンをクリックしたときにすべてのデータを取得することです:

名前1 - 1

名前2 - 3

名前3 - 2

名前4 - 3

...

最初の列 - TextViewからのテキスト

2 列目 - 選択したRadioButtonのタグ

ビュー付きアクティビティ:

public class MarksAdd  extends ListActivity {
    ArrayList<String> itemlist = new ArrayList<String>();
    private Context context = null;
    private ListView listView;
    private Button BtnDone;
    @Override
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.marks_add);


        Intent intent = getIntent();
        int day = intent.getIntExtra("day", 0);
        int month = intent.getIntExtra("month", 0);
        int year = intent.getIntExtra("year", 0);


        String dayStr = String.valueOf(day);
        String monthStr = String.valueOf(month);
        String yearStr = String.valueOf(year);


        if (day != 0) {
            if(dayStr.length()==1){
                dayStr = "0"+dayStr;
            }
            if(monthStr.length()==1){
                monthStr = "0"+monthStr;
            }
            yearStr = yearStr.substring(2);
            String date = dayStr+"."+monthStr+"."+yearStr;
            Toast.makeText(this, date, Toast.LENGTH_SHORT).show();
        }


        final ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this,
                getModel());





        listView = getListView();
        LayoutInflater inflater = getLayoutInflater();
        listView.addFooterView(inflater.inflate(R.layout.list_footer, null), null, false);

        setListAdapter(adapter);

        BtnDone = (Button) findViewById(R.id.markListBtn);
        BtnDone.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //get Values ?????

            }



        });


    }

    private List<Model> getModel() {

        List<Model> list = new ArrayList<Model>();

        dbHelper sql = new dbHelper(this);
        SQLiteDatabase db = sql.getWritableDatabase();
        Cursor cursor = db.query(
                PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("group", ""), new String[]{
                        "Id", "Name"},
                null, // The columns for the WHERE clause
                null, // The values for the WHERE clause
                null, // don't group the rows
                null, // don't filter by row groups
                "Name ASC" // The sort order
        );

        while (cursor.moveToNext()) {
            // GET COLUMN INDICES + VALUES OF THOSE COLUMNS
            int id = cursor.getInt(cursor.getColumnIndex("Id"));
            String name = cursor.getString(cursor
                    .getColumnIndex("Name"));
            list.add(get(name));

        }
        cursor.close();





        // Initially select one of the items


        return list;
    }

    private Model get(String question) {
        return new Model(question);
    }



}

アレイアダプター:

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
    private final List<Model> list;
    private final Activity context;

    public InteractiveArrayAdapter(Activity context, List<Model> list) {
        super(context, R.layout.simple_list_item1_marks, list);
        this.context = context;
        this.list = list;
    }

    class ViewHolder {
        TextView t = null;
        RadioGroup group;

        ViewHolder(View v) {
            t = (TextView) v.findViewById(R.id.personName);
            group = (RadioGroup) v.findViewById(R.id.myRgroup);
        }

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder = null;

        if (v == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            v = inflater.inflate(R.layout.simple_list_item1_marks, parent, false);
            holder = new ViewHolder(v);
            v.setTag(holder);
            final View finalV = v;
            holder.group
                    .setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

                        public void onCheckedChanged(RadioGroup group,
                                                     int checkedId) {
                            Integer pos = (Integer) group.getTag(); // To identify the Model object i get from the RadioGroup with getTag()
                            //  an integer representing the actual position
                            Model element = list.get(pos);
                            switch (checkedId) { //set the Model to hold the answer the user picked
                                case R.id.rb1:
                                    element.current = Model.ANSWER_ONE_SELECTED;
                                    break;
                                case R.id.rb2:
                                    element.current = Model.ANSWER_TWO_SELECTED;
                                    break;
                                case R.id.rb3:
                                    element.current = Model.ANSWER_THREE_SELECTED;
                                    break;
                                case R.id.rb4:
                                    element.current = Model.ANSWER_FOUR_SELECTED;
                                    break;
                                default:
                                    element.current = Model.NONE; // Something was wrong set to the default
                            }

                        }
                    });
        } else {
            holder = (ViewHolder) v.getTag();
        }
        holder.group.setTag(position); // I passed the current position as a tag

        holder.t.setText(list.get(position).question); // Set the question body

        if (list.get(position).current != Model.NONE) {
            RadioButton r = (RadioButton) holder.group.getChildAt(list
                    .get(position).current);
            r.setChecked(true);
        } else {
            holder.group.clearCheck(); // This is required because although the Model could have the current
            // position to NONE you could be dealing with a previous row where
            // the user already picked an answer.

        }
        return v;
    }
}

モデル:

public class Model {
    String question; // hold the question
    int current = NONE; // hold the answer picked by the user, initial is NONE(see below)
    public static final int NONE = 1000; // No answer selected
    public static final int ANSWER_ONE_SELECTED = 0; // first answer selected
    public static final int ANSWER_TWO_SELECTED = 1; // second answer selected
    public static final int ANSWER_THREE_SELECTED = 2; // third answer selected
    public static final int ANSWER_FOUR_SELECTED = 3; // forth answer selected

    public Model(String question) {
        this.question = question;
    }
}

そのチュートリアルに従って、いくつかの変更を加えてこれを行っていました。実際、私は開発の初心者なので、助けてください。私の質問が正しくない場合は申し訳ありません。私の英語はあまり上手ではありません。

ここで何か助けてくれてありがとう。

4

1 に答える 1

0

最初に考えられるのは、 を反復処理して、ListView各行でチェックされたボタンを取得することです。ListView には常にすべての子が含まれているわけではないため、これは実際には機能しません。

代わりに、ユーザーが実際に選択したときに、チェックされたアイテムを保存する必要があります。次に、ボタンを押すと、すべてのデータが既に保存されているため、 を反復処理する必要はありませんListView。また、現在の選択内容をこの方法で保存すると、リストを上にスクロールする場合に便利です。これは、現在チェックされているラジオ ボタンを の前の項目に設定できるためですgetView()

行レイアウトにこれがあると仮定しましょう:

<RadioGroup android:id="@+id/radio_group" ... >
    <RadioButton android:id="@+id/radio_button_1" ... />
    <RadioButton android:id="@+id/radio_button_2" ... />
    <RadioButton android:id="@+id/radio_button_3" ... />
    <RadioButton android:id="@+id/radio_button_4" ... />
</RadioGroup>

アダプタのgetView()で、RadioGroup をOnCheckedChangedListenerアダプタ自体で定義します (OnCheckedChangedListener行ごとに 1 つではなく 1 つにします)。RadioGroup にリスト項目の位置のタグを付けて、コールバックで区別できるようにします。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ...
    Model model = getItem(position);
    int checkedId = ... //figure out checked id from model
    viewHolder.group.check(checkedId);
    viewHolder.group.setTag(position);
    viewHolder.group.setOnCheckedChangedListener(checkChangedListener);
    ...
}

private OnCheckedChangedListener checkChangedListener = new OnCheckedChangedListener() {
    @Override
    public void onCheckChanged(RadioGroup group, int checkId) {
        Object tag = group.getTag();
        if (!(tag instanceof Integer)) {
            // you have a bug. Fix it!
            return;
        }

        int position = (Integer) tag;
        Model model = getItem(position);

        switch(checkedId) {
        case R.id.radio_button_1:
            model.setCurrent(Model.ANSWER_ONE_SELECTED); break;
        case R.id.radio_button_1:
            model.setCurrent(Model.ANSWER_TWO_SELECTED); break;
        case R.id.radio_button_1:
            model.setCurrent(Model.ANSWER_THREE_SELECTED); break;
        case R.id.radio_button_1:
            model.setCurrent(Model.ANSWER_FOUR_SELECTED); break;
        }
    }
};

あとは、アダプターからモデルのリストを取得するだけです。

于 2014-05-13T03:19:40.100 に答える