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

因此,我一直没有找到解决方案的问题是,我不知道如何获取实际的Spinner甚至获取单击的ListItem所在的Spinner行。 Activity扩展ListActivity。有人知道不使用ViewHolder就可以做到这一点的方法吗?还是必须使用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);


谢谢。

最佳答案

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


  显示数据列表(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行。

关于android - ListView中的Android Spinners,我必须使用ViewHolder吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10816765/

10-10 09:48