2

に問題がSpinnersありListViewます。、ラベル、および 2 つの がありListViewます。これらは SQLite から読み込まれ、正常に動作しています。これまでのところ、行をクリックするとチェックがオンまたはオフになり、変更がすぐにデータベースに保存されるため、このメソッドは使用していません。行がチェックされている場合は表示されますが、行がチェックされていない場合は表示されません。CheckBoxSpinnersSpinnerViewHolderListViewCheckBoxesSpinners

したがって、解決策を見つけることができなかった問題は、実際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);

ありがとう。

4

1 に答える 1

2

あなたの質問を理解できたかどうかわかりません: あなたのアプリ フローが次の場合:

データのリストを表示する( CheckBox+ TextView(Spinners非表示)) ->
ユーザーが行をクリックする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 に答える