0

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

名称 1 - 1

名称 2 - 3

名称 3 - 2

名称 4 - 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);
    }



}

阵列适配器:

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而不是每行一个)。使用列表项的位置标记 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 回答