从ListView Android中的Radio Buttons获取标签

时间:2014-05-13 02:15:19

标签: android android-listview android-arrayadapter android-radiogroup

我有一个使用 ArrayAdapter 构建的自定义 listView 。在 ListView 中,每个项目都包含 TextView RadioGroup (包含4 RadioButton )。我可以为每个列表项选择一个 RadioButton 。在 ListView 的底部,我有一个带按钮的页脚。我想要的是当我点击这样的按钮时获取所有数据:

name1 - 1

name2 - 3

name3 - 2

name4 - 3

...

第一栏 - 来自 TextView

的文字

第二列 - 所选 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);
    }



}

ArrayAdapter:

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;
    }
}

我根据that tutorial进行了一些更改。 Actualy我真的是开发中的新手,所以我要求你帮助我。对不起,如果我的问题不正确,我的英语不是很好。

非常感谢这里的任何帮助。

1 个答案:

答案 0 :(得分: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()中,给适配器本身定义的OnCheckedChangedListener一个{(1}}(所以你有一个OnCheckedChangedListener而不是每行一个)。使用列表项的位置标记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;
        }
    }
};

现在您只需要从适配器获取模型列表。