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

Reply via email to