Обновите пользовательский CursorAdapter изнутри себя без requery ()

#android #listview #cursor #android-cursoradapter

#Android #listview #курсор #android-cursoradapter

Вопрос:

У меня есть ListView, который заполнен покупкой пользовательского CursorAdapter. У меня есть кнопка в каждой строке, при нажатии на которую значение в базе данных переключается и изменяется вид значка. Прослушиватель для этой кнопки добавлен в метод BindView. Проблема в том, что когда это происходит, курсор не обновляется, поэтому при следующем перерисовывании списка (появляется клавиатура и исчезает, или список прокручивается) значок возвращается к исходному виду. Поскольку все это происходит в классе CursorAdapter, я не могу перезагрузить курсор оттуда, и значение requery отменено. Как я могу запустить перезагрузку курсора при изменении данных? Я не хочу идти по пути использования ContentProvider и ContentObserver для этой простой задачи. Это кажется ооочень простым, но я заливал этот сайт и многие другие, буквально часами бился головой о стену на нем.

 @Override
public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder mvh = (ViewHolder)view.getTag();

        TextView productName = mvh.name;

        productName.setText(cursor.getString(cursor.getColumnIndex(ProductsDbAdapter.KEY_PRODUCT_NAME)));


        ImageView addShoppingIcon = mvh.addShopIcon;


        //get icon state from cursor. 
        boolean isneeded = (cursor.getInt(cursor.getColumnIndex(ProductsDbAdapter.KEY_PRODUCT_ISNEEDED)) == 0 ? false : true);

        //set icon tag with icon data for OnClick
        long rowid = cursor.getLong(cursor.getColumnIndex(ProductsDbAdapter.KEY_ROWID));
        addShoppingIcon.setTag(new PantryHolder(rowid,inpantry,isneeded));


        //set icon bitmap
        if(isneeded)
            addShoppingIcon.setImageBitmap(MainActivity.mPantryNeedIcon);
        else
            addShoppingIcon.setImageBitmap(MainActivity.mPantryHasIcon);


        //add listener      
        addShoppingIcon.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                PantryHolder mph = (PantryHolder)v.getTag(); 
                ImageView icon = (ImageView)v;
                if(mph.inpantry){
                    if (mph.isneeded) 
                        icon.setImageBitmap(MainActivity.mPantryHasIcon);
                    else 
                        icon.setImageBitmap(MainActivity.mPantryNeedIcon);

                } else {
                    if (mph.isneeded) 
                        icon.setImageBitmap(RealMealzActivity.mQuickAddIcon);
                    else 
                        icon.setImageBitmap(RealMealzActivity.mQuickAddGrayIcon);

                }
                mph.isneeded = !mph.isneeded;
                v.setTag(mph);
                                    //update database using database helper
                mDbAdapter.updateIsNeeded(mph.rowid, mph.isneeded);
            }
        }); 


}   
  

Комментарии:

1. Я создал обходной путь, добавив: changeCursor(mDbAdapter.fetchPantryProducts()); в конце метода onClick… но это кажется таким беспорядочным. В документе Google говорится, что это делается асинхронно. Должен быть другой способ.

2. Вы можете, конечно, просто прочитать данные из вашей базы данных в память, например, в объекты, хранящиеся в ArrayListAdapter , затем позволить пользователю изменять данные по своему усмотрению, а затем сохранить измененное состояние ваших объектов. — Если ваши данные не требуют чрезмерных объемов памяти (мегабайт или более), то есть.