Nick,

- Since list item views get recycled, you've got to have something that maintains item state (checked / unchecked) - besides the checkboxes in your list, since those are part of recycled item layouts.

- To change data in the database, use the usual database update methods. Other than constantly opening and closing the database, your code looks ok.

- To refresh the list, call adapter.notifyDataSetChanged(). This causes the list view to rebuild its item views, calling your getView(), which sets checkbox state according to values in the database.

-- Kostya

29.01.2011 23:58, Nick пишет:
I'm using SimpleCursorAdapter just because I store data in the
database.
And you suggested to use standard layout what isn't suitable for me.

On 29 янв, 20:46, Robin Talwar<[email protected]>  wrote:
Its better to use

ArrayAdapter<String>  adapter=new
ArrayAdapter<String>(playlist_new.this,android.R.layout.simple_list_item_mu 
ltiple_choice,song_name);
         lv.setAdapter(adapter);
          lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);







On Sat, Jan 29, 2011 at 10:51 PM, Nick<[email protected]>  wrote:
Hi! I have ONE annoying problem with SimpleCursorAdapter. My programm
has list view and ListActivity. Each row has it's own layout:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal" android:weightSum="1.0">
<TableRow>
    <TextView android:id="@+id/task_time"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
        android:textSize="24sp" android:text="Time">
    </TextView>
    <LinearLayout android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent">
        <TextView android:id="@+id/task_name"
            android:layout_width="wrap_content"
android:layout_height="wrap_content"
            android:textSize="20sp" android:text="Name">
        </TextView>
        <TextView android:id="@+id/task_categoty"
            android:layout_width="wrap_content"
android:layout_height="wrap_content"
            android:text="Category" android:textSize="12sp">
        </TextView>
    </LinearLayout>
    <TextView android:id="@+id/task_state"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
        android:text="State" android:textSize="12sp">
    </TextView>
    <CheckBox android:id="@+id/task_enabled"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
android:focusable="false">
    </CheckBox>
</TableRow>
Tasks are stored in SQLite database. I have DAO object (singleton) to
access the database. TaskDao:
    public void updateEnabled(int id, boolean enabled){
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(ENABLED_COLUMN, enabled==true?1:0);
    Log.i(TAG, "update to " + cv.get(ENABLED_COLUMN) );
    try{
        db.beginTransaction();
        db.update(TASK_TABLE, cv, ID_COLUMN+"=?", new String[]{id
+""});
        db.setTransactionSuccessful();
    } catch (SQLException e) {
        Log.i(TAG, "edit task failed!");
    } finally {
        db.endTransaction();
        if (db != null)
            db.close();
    }
}
and the Cursor method for ListActivity:
    public Cursor getTasks(){
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    return db.query(TASK_TABLE, COLUMNS, null, null, null, null,
NAME_COLUMN);
}
I extended SimpleCursorAdapter (TaskDbAdapter) like this:
    @Override
public View getView(int position, View convertView, ViewGroup parent)
{
    if(convertView==null){
        convertView = inflater.inflate(R.layout.task_list_row, null);
    }
    Cursor c = getCursor();
    c.moveToPosition(position);
    Log.i(TAG, "getView " + position + " = " + c.getInt(enabledIdx));
    enabled.setTag(c.getInt(c.getColumnIndex(BaseColumns._ID)));
    enabled.setChecked(c.getInt(enabledIdx)>0?true:false);
    enabled.setOnClickListener(this);
    return convertView;
}
@Override
public void onClick(View v) {
    CheckBox box = (CheckBox) v;
    Integer id = (Integer)box.getTag();
    TaskDao.getInstance(context).updateEnabled(id.intValue(),
box.isChecked());
}
And at last I use all the above stuff in my main ListActivity
    private void refreshList(){
    c = TaskDao.getInstance(this).getTasks();
    startManagingCursor(c);
    adapter = new TaskDbAdapter(this, R.layout.task_list_row, c, new
String[]{TaskDao.ENABLED_COLUMN}, new int[]{R.id.task_enabled});
    setListAdapter(adapter);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.task);
    getListView().setItemsCanFocus(false);
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    getListView().setVerticalScrollBarEnabled(true);
    registerForContextMenu(getListView());
    getListView().setOnCreateContextMenuListener(this);
    refreshList();
}
@Override
protected void onResume() {
    super.onResume();
    refreshList();
}
@Override
protected void onPause() {
    super.onPause();
}
Everything works fine. But CheckBoxes loose their states. For instance
I check my first column and scroll the list down. In my trace before
press I have:
getView 0 = 0
getView 2 = 0
getView 3 = 0
then
uptate to 1
and then (when I scroll up to the first element)
getView 0 = 0
getView 2 = 0
getView 3 = 0
I tried to make getCursor().requery(); in my TaskDbAdapter onClick
method. But then I saw no items in the list! And exception because of
cursor management(connection was closed by android). When I write
startManagingCursor(c); in refreshList() method then check and uncheck
methods don't work. Please, Help!
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]<android-developers%2Bunsubs 
[email protected]>
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en


--
Kostya Vasilyev -- WiFi Manager + pretty widget -- http://kmansoft.wordpress.com

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to