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

Reply via email to