Thanks fro advice. I tried but had no luck.
By the way, my getViw method was called even without
notifyDatasetChanged().
It was while scrolling. Now it's called after click. But still have
this in trace log:
uptate to 1
getView 0 = 0 (here must be 1)
getView 2 = 0
getView 3 = 0

And... is it bad to reopen cursor? As I see it....database is a store
for checked values. Like boolean array for ArrayAdapter.


On 30 янв, 00:13, Kostya Vasilyev <[email protected]> wrote:
> 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