1

私はこれについて複数の質問を精査しましたが、私が探しているものを実装する方法をまだ見つけていません。フォームにある単純なカスタムcursorAdapterがあります

|textviewチェックボックス|

チェックボックスをスクロールすると、リサイクル時に状態が失われます。ブール値を格納するためにarrayListを使用しようとしましたが、それらをチェックすると、trueとして戻らないようです。

public class BrowseCardsAdapter extends CursorAdapter {

private LayoutInflater mInflater = null;
private Context mContext;
public DataBaseHelper myDbHelper = null;

public BrowseCardsAdapter(Context context, Cursor cursor) {
super(context, cursor, true);
mInflater = LayoutInflater.from(context);
mContext = context;

myDbHelper = new DataBaseHelper(mContext);

try {
    myDbHelper.openDataBaseForUpdate();
} catch (SQLException sqle) {
    throw sqle;
}
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

return mInflater.inflate(R.layout.list_cards, parent, false);

}

@Override
public void bindView(final View view, final Context context, final Cursor cursor) {

final CheckBox cb_have     = (CheckBox) view.findViewById(R.id.cb_have);
TextView cardNumber        = (TextView) view.findViewById(R.id.tv_cardnumber);

final String cardNumberText  = cursor.getString(cursor.getColumnIndex("CardNumber"));       
final String have = cursor.getString(cursor.getColumnIndex("Have"));

cardNumber.setText(cardNumberText);

if (have.compareTo("true") == 0)
    cb_have.setChecked(true);
else
    cb_have.setChecked(false);

cb_have.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {

    if (cb_have.isChecked()) {
        myDbHelper.addHaveToDatabase(cardNumberText, true);
        cb_have.setChecked(true);   
    }
    else {
        myDbHelper.addHaveToDatabase(cardNumberText, false);
        cb_have.setChecked(false);
    }
    myDbHelper.close();
 });

}

持っている状態をデータベースに保存しているので、持っている状態をチェックしてチェックボックスを設定したいと思います。このようにして、ユーザーがアクティビティに参加すると、以前に選択したアイテムと新しい選択が表示されます。これは、新しく選択されたアイテムの状態を失う画面外のビューをスクロールするシナリオを除いて、うまく機能します。誰かが私に状態を保存する方法についてのいくつかの指針を与えることができますか?

4

2 に答える 2

1

コレクションの使用に戻ってみてください。そのような増分でデータベースに書き込むことはお勧めできません。

ここ:

    public class BrowseCardsAdapter extends CursorAdapter {

        private LayoutInflater mInflater = null;
        private boolean[] arrCb;

        public BrowseCardsAdapter(Context context, Cursor cursor) {
            super(context, cursor, true);
            mInflater = LayoutInflater.from(context);

            arrCb = new boolean[cursor.getCount()];
            for (int i = 0; i < arrCb.length; i++) {
                arrCb[i] = false;
            }
            // ^otherwise you can loop through the database (in your activity)
            // to fill this array with the correct values and pass it as a parameter
            // it'd look like initCb() below;
        }

/*      private boolean[] initCb() {
            Cursor cursor = myDbHelper.query(query statement);
            boolean[] arr = new boolean[cursor.getCount()];
            int i = 0;  
            while (cursor.moveToNext()) {
                arr[i] = cursor.getString(cursor.getColumnIndex("Have"));
                // ^obviously you'd need to convert your value to boolean however
                i++;
            }
            return arr;
        }*/

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {

            return mInflater.inflate(R.layout.list_cards, parent, false);

        }

        @Override
        public void bindView(final View view, final Context context, final Cursor cursor) {

            final CheckBox cb_have     = (CheckBox) view.findViewById(R.id.cb_have);
            TextView cardNumber        = (TextView) view.findViewById(R.id.tv_cardnumber);

            final String cardNumberText  = cursor.getString(cursor.getColumnIndex("CardNumber"));       
//          final String have = cursor.getString(cursor.getColumnIndex("Have"));

            cardNumber.setText(cardNumberText);

            cb_have.setChecked(arrCb[cursor.getPosition()]);    
            cb_have.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (cb_have.isChecked()) {
                        arrCb[cursor.getPosition()] = true;
                    } else {
                        arrCb[cursor.getPosition()] = false;                        
                    }
                }
            });

        }
    }

コレクションを埋める2つの方法が提供されています。テクニックに関しては、常にデータベースに書き込んでいるため、アダプターが作成された古いカーソルを使用して値を取得することはできません。行がロードされるたびにカーソルを再インスタンス化する必要があります。確かにこれらの要件はあなたがそれをあきらめるでしょう。

于 2012-12-04T03:33:20.297 に答える
0

OnCheckChangeListenerをnullとして設定する簡単な方法の1つ。

このコードをアダプタに追加する必要があります。

yourcheckboxid.setOnCheckChangeListener(null) 
于 2017-03-22T17:09:04.663 に答える