2

我有一个Spinners问题ListView。我有一个ListView带有CheckBox一个标签和两个的Spinners。这些Spinner是从 SQLite 填充的,并且工作正常。我没有使用该ViewHolder方法,因为到目前为止,当ListView单击该行时,CheckBoxes已选中或未选中,并且更改会立即保存到数据库中。选中该行时,该行变为Spinners可见,但未选中该行时不可见。

所以我没有设法找到解决方案的问题是我不知道如何获得实际Spinner的,甚至不知道如何获得ListItem点击Spinner所在的行。Activity延伸ListActivity。_ 任何人都知道我可以在不使用 a 的情况下做到这一点,ViewHolder还是必须使用 a ViewHolder

这是声明和填充的代码ListView

mSsCursor = mDbHelper.fetchAllSsPlaylistSs(mPlId);
        startManagingCursor(mSsCursor);

        String[] from = new String[]{"pl_selected", BTDbAdapter.KEY_NAME, BTDbAdapter.KEY_NAME2};

        int[] to = new int[]{R.id.pl_selected, R.id.name, R.id.name2};

        mAllSs = new SimpleCursorAdapter(this, R.layout.pl_edit_ss_row, mSsCursor, from, to);
        mAllSs.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        //custom handling of setting the value
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            if(columnIndex == 3) {
                    ViewGroup row = (ViewGroup)view.getParent().getParent();
                    mSId = cursor.getInt(0);
                    if (cursor.getInt(3) > 0) {
                        mCheckBox = (CheckBox) row.findViewById(R.id.pl_selected);
                        mCheckBox.setChecked(true);
                        mTSpin = (Spinner) row.findViewById(R.id.pl_t_spin);
                        mMSpin = (Spinner) row.findViewById(R.id.pl_m_spin);
                        mtvT = (TextView) row.findViewById(R.id.pl_t);
                        mtvM = (TextView) row.findViewById(R.id.pl_m);
                        mTSpin.setVisibility(View.VISIBLE);
                        mtvT.setVisibility(View.VISIBLE);
                        mMSpin.setVisibility(View.VISIBLE);
                        mtvM.setVisibility(View.VISIBLE);
                        //set the values in the t spinner
                        PopulateTSpinner(cursor.getInt(4));
                        //set the values in the m spinner
                        PopulateMSpinner(cursor.getInt(5));
                    }
                    else {
                        mCheckBox = (CheckBox) row.findViewById(R.id.pl_selected);
                        mCheckBox.setChecked(false);
                        mTSpin = (Spinner) row.findViewById(R.id.pl_t_spin);
                        mMSpin = (Spinner) row.findViewById(R.id.pl_m_spin);
                        mtvT = (TextView) row.findViewById(R.id.pl_t);
                        mtvM = (TextView) row.findViewById(R.id.pl_m);
                        mTSpin.setVisibility(View.GONE);
                        mtvT.setVisibility(View.GONE);
                        mMSpin.setVisibility(View.GONE);
                        mtvM.setVisibility(View.GONE);
                    }                   
                    return true;
            }
            return false;
        }
    });
    setListAdapter(mAllSs);

谢谢。

4

1 回答 1

2

我不知道我是否理解您的问题:如果您的应用流程是:

显示数据列表(CheckBox+ TextViewSpinners隐藏))->
用户单击一行(Spinners显示带有(个人)数据的该行)->
用户在其中选择某些Spinners内容-> 将该选择保存在数据库中

那么我认为您应该使用自定义适配器并自己处理行创建+数据绑定(我不明白您将如何为 设置侦听器Spinners)。下面是一个关于如何执行此操作的小示例(尽管可能不是一个很好的方法):

public class CustomAdapter extends SimpleCursorAdapter {

        private LayoutInflater mInflater;

        public CustomAdapter(Context context, int layout, Cursor c,
                String[] from, int[] to) {
            super(context, layout, c, from, to);
            mInflater = LayoutInflater.from(context);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ViewHolder holder = (ViewHolder) view.getTag(); // the holder
                                                            // pattern
            // set the text for the TextView in your row
            holder.name
                    .setText(cursor.getString(cursor.getColumnIndex("name")));
            // status of the CheckBox from the database
            int status = cursor.getInt(cursor.getColumnIndex("pl_selected"));
            // set the CheckBox status
            holder.ckb.setChecked((status > 0) ? true : false);
            // get the id of this particular row, we'll use this later in the
            // Spinner's listeners
            long theId = cursor.getLong(cursor.getColumnIndex("_id"));
            // see if it is time to show the Spinners
            if (status > 0) {
                // it is time to show the Spinners. Here you would do stuff
                // like: setting up the Spinner's adapters + setting the
                // listener
                // I used a Spinner with entries set in the xml layout(so my
                // selection result is a String)
                holder.spin1.setVisibility(View.VISIBLE);
                holder.spin2.setVisibility(View.VISIBLE);
                // set theId as a tag so you know which Spinner was acted on
                holder.spin1.setTag(new Long(theId));
                holder.spin1
                        .setOnItemSelectedListener(new OnItemSelectedListener() {

                            @Override
                            public void onItemSelected(AdapterView<?> parent,
                                    View view, int position, long id) {
                                Long realRowId = (Long) parent.getTag();
                                // I don't know
                                ContentValues cv = new ContentValues();
                                // the column where I saved the spinner selected
                                // item is called "saved_item"
                                cv.put("saved_item", (String) parent
                                        .getItemAtPosition(position));
                                // mDb is my SQLiteDatabase instance
                                mDb.update("tbl", cv, "_id = ?",
                                        new String[] { String
                                                .valueOf(realRowId) });
                                // I don't know how you saved the data, the
                                // above is just an example
                            }

                            @Override
                            public void onNothingSelected(AdapterView<?> parent) {

                            }
                        });
                // also implement the second Spinner like the first one
            } else {
                // required to prevent a recycled View from causing damage
                holder.spin1.setVisibility(View.GONE);
                holder.spin2.setVisibility(View.GONE);
            }
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View v = mInflater.inflate(R.layout.adapters_listspinner_row,
                    parent, false);
            ViewHolder holder = new ViewHolder();
            holder.spin1 = (Spinner) v.findViewById(R.id.spinner1);
            holder.spin1.setFocusable(false);
            holder.spin2 = (Spinner) v.findViewById(R.id.spinner2);
            holder.spin2.setFocusable(false);
            holder.name = (TextView) v.findViewById(R.id.textView1);
            holder.ckb = (CheckBox) v.findViewById(R.id.checkBox1);
            holder.ckb.setFocusable(false);
            v.setTag(holder);
            return v;
        }

        class ViewHolder {
            Spinner spin1, spin2;
            TextView name;
            CheckBox ckb;
        }

    }

此外,所需的onListItemcClick方法:

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // manage the CheckBox state
        CheckBox ckb = (CheckBox) v.findViewById(R.id.checkBox1);
        ckb.setChecked(!ckb.isChecked());
        ContentValues cv = new ContentValues();
        cv.put("pl_selected", ckb.isChecked() ? 1 : 0);
        mDb.update("tbl", cv, "_id = ?",
                new String[] { String.valueOf(id) });
        // requery the database so the changes are seen by the adapter, this is horrible! 
        Cursor re = mDb.query("tbl", null, null, null, null, null, null);
        mAllSs.changeCursor(re);
    }

作为建议,也许您可​​以修改应用程序的布局并将其Spinners移出ListView行外。

于 2012-05-30T15:31:42.947 回答