If the cursor still pulls out old values after the update, try adding a call to requery().
-- Kostya Vasilyev -- http://kmansoft.wordpress.com 30.01.2011 1:17 пользователь "Nick" <ympe...@gmail.com> написал: > 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 <kmans...@gmail.com> 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<r.o.b.i.n.abhis...@gmail.com> 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<ympe...@gmail.com> 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 android-developers@googlegroups.com >> >>> To unsubscribe from this group, send email to >> >>> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com><android-developers%2Bunsubs cr...@googlegroups.com> >> >>> 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 android-developers@googlegroups.com > To unsubscribe from this group, send email to > android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com> > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en