web-dev-qa-db-ja.com

Android:データベースのデータをListViewのCheckBoxにバインドしますか?

SQLiteDatabaseからListViewにデータをバインドしようとしています。現在、SimpleCursorAdapterを使用してListViewを埋めています。残念ながら、これはCheckBoxのchecked属性の設定では機能しないようです。

これが今の私のやり方です。 CheckBoxのチェック状態を変更する代わりに、アダプターは値をテキスト引数に入力するため、値はCheckBoxの右側にテキストとして表示されます。

Java:

setListAdapter( new SimpleCursorAdapter( this,
      R.layout.mylist,
      data,
      new String[] { Datenbank.DB_STATE, Datenbank.DB_NAME },
      new int[] { R.id.list_checkbox, R.id.list_text }
    ) );

mylist.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout Android:id="@+id/LinearLayout01"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
>

<CheckBox Android:text=""
    Android:id="@+id/list_checkbox"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="false"
    ></CheckBox>

<TextView Android:text=""
    Android:id="@+id/list_text"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    ></TextView>

</LinearLayout>

編集:データベース内のフィールドはもちろんブール型であり、値を入力するためにチェックされたフィールドにIDを割り当てようとしました。

43
svens

オーバーライドするものに応じて、newView/bindViewまたはgetViewをオーバーライドするカスタムアダプターを作成する以外に、これをどのように行うかわかりません(ResourceCursorAdapterが適切です)。

OK、だからここに例があります。私は仕事をしているのでコンパイルできるかどうかをテストしませんでしたが、これは間違いなくあなたを正しい方向に向けるべきです:

public class MyActivity extends ListActivity {

    MyAdapter mListAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Cursor myCur = null;

        myCur = do_stuff_here_to_obtain_a_cursor_of_query_results();

        mListAdapter = new MyAdapter(MyActivity.this, myCur);
        setListAdapter(mListAdapter);
    }


    private class MyAdapter extends ResourceCursorAdapter {

        public MyAdapter(Context context, Cursor cur) {
            super(context, R.layout.mylist, cur);
        }

        @Override
        public View newView(Context context, Cursor cur, ViewGroup parent) {
            LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            return li.inflate(R.layout.mylist, parent, false);
        }

        @Override
        public void bindView(View view, Context context, Cursor cur) {
            TextView tvListText = (TextView)view.findViewById(R.id.list_text);
            CheckBox cbListCheck = (CheckBox)view.findViewById(R.id.list_checkbox);

            tvListText.setText(cur.getString(cur.getColumnIndex(Datenbank.DB_NAME)));
            cbListCheck.setChecked((cur.getInt(cur.getColumnIndex(Datenbank.DB_STATE))==0? false:true))));
        }
    }
}
33
MattC

カスタムを設定できます SimpleCursorAdapter.ViewBinder

SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(/* ur stuff */);
cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        if(columnIndex == 1) {
            CheckBox cb = (CheckBox) view;
            cb.setChecked(cursor.getInt(1) > 0);
            return true;
        }
        return false;
    }
});

setViewValueメソッドは、SimpleCursorAdapterコンストラクターで指定するすべての列に対して呼び出され、ビューの一部(またはすべて)を操作するのに適した場所を提供します。

37
Josef Pfleger

次のようなカスタムCheckBoxウィジェットを作成することで、この問題を解決できます。

package com.example.CustomCheckBox;    
public class CustomCheckBox extends CheckBox {
     public CustomCheckBox(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
     }
     public CustomCheckBox(Context context, AttributeSet attrs) {
      super(context, attrs);
     }
     public CustomCheckBox(Context context) {
      super(context);
     }
     protected void onTextChanged(CharSequence text, int start, int before, int after) {
      if (text.toString().compareTo("") != 0) {
       setChecked(text.toString().compareTo("1") == 0 ? true : false);
       setText("");
      }
     }
    }

OnTextChanged関数は、ListViewがデータをCheckBoxにバインドするときに呼び出されます(つまり、「0」または「1」のいずれかを追加します)。これにより、その変更がキャッチされ、ブール処理が追加されます。無限再帰を作成しないために、最初の「if」ステートメントが必要です。

次に、カスタムファイルをレイアウトファイルに提供します。

<com.example.CustomCheckBox
 Android:id="@+id/rowCheckBox"
 Android:layout_height="fill_parent"
 Android:layout_width="wrap_content" />

それはそれを行う必要があります!

0
Nick