By the way, how many items do you expect to have in these lists? -- Kostya Vasilyev -- http://kmansoft.wordpress.com 30.01.2011 1:27 пользователь "Kostya Vasilyev" <[email protected]> написал: > 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" <[email protected]> написал: >> 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%[email protected]> <android-developers%[email protected]<android-developers%[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]<android-developers%[email protected]> <android-developers%[email protected]<android-developers%[email protected]> > >> 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 [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

