【问题标题】:Refreshing my ListView within my Cursor Adapter?在我的光标适配器中刷新我的 ListView?
【发布时间】:2017-02-10 07:27:17
【问题描述】:

长期潜伏者 - 第一篇文章:

问题:当我单击图像按钮(基本上只是复选框)时,它们将正确更新我的数据库行并将图像更改为正确的布尔值。但是,当我再次单击它们时 - 它不会重新更新并发出相同的消息。

我认为问题是:我对 Android 比较陌生,但我很确定当我的数据库正确更新时,我的 bindview 变量不是?

我的光标适配器BindView:

        @Override
public void bindView(View view, final Context context, final Cursor cursor) {
    final String id = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_ID));
    final String name2 = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_NAME));
    final String gift = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_GIFT));
    final String specs = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_SPECIFICS));
    final String store = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_STORE));
    final String url = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_URL));
    final String status = cursor.getString(cursor.getColumnIndex(DBHELPER.WISHLIST_COLUMN_STATUS));

    ImageButton checkBoxImage = (ImageButton) view.findViewById(R.id.ID_ROW_CHECKBOX);

    if(status.equals("true"))
    {
        checkBoxImage.setImageResource(R.drawable.icon_yes);
    } else {
        checkBoxImage.setImageResource(R.drawable.icon_no);
    }

    checkBoxImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(status.equals("true"))
            {
                ContentValues values = new ContentValues();
                values.put(DBHELPER.WISHLIST_COLUMN_NAME, name2);
                values.put(DBHELPER.WISHLIST_COLUMN_GIFT, gift);
                values.put(DBHELPER.WISHLIST_COLUMN_SPECIFICS, specs);
                values.put(DBHELPER.WISHLIST_COLUMN_STORE, store);
                values.put(DBHELPER.WISHLIST_COLUMN_URL, url);
                values.put(DBHELPER.WISHLIST_COLUMN_STATUS, "false");

                DBHELPER dbhelper = new DBHELPER(context);
                SQLiteDatabase db = dbhelper.getWritableDatabase();

                db.update(DBHELPER.WISHLIST_TABLE_NAME, values,"_ID " + "='" + id + "'", null);
                Message.message(context, "FALSE UPDATED");

                ImageButton checkBoxImage = (ImageButton) v.findViewById(R.id.ID_ROW_CHECKBOX);
                checkBoxImage.setImageResource(R.drawable.icon_no);

                db.close();
            } else {
                DBHELPER dbhelper = new DBHELPER(context);
                SQLiteDatabase db = dbhelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(DBHELPER.WISHLIST_COLUMN_NAME, name2);
                values.put(DBHELPER.WISHLIST_COLUMN_GIFT, gift);
                values.put(DBHELPER.WISHLIST_COLUMN_SPECIFICS, specs);
                values.put(DBHELPER.WISHLIST_COLUMN_STORE, store);
                values.put(DBHELPER.WISHLIST_COLUMN_URL, url);
                values.put(DBHELPER.WISHLIST_COLUMN_STATUS, "true");

                ImageButton checkBoxImage = (ImageButton) v.findViewById(R.id.ID_ROW_CHECKBOX);
                checkBoxImage.setImageResource(R.drawable.icon_yes);

                System.out.println("BEFORE : " + status);
                db.update(DBHELPER.WISHLIST_TABLE_NAME, values,"_ID " + "='" + id + "'", null);
                 Message.message(context, "TRUE UPDATED");


                db.close();
            }
        }
    });

我尝试过的:所以我点击一张图片,它会从“选中”变为“未选中”,反之亦然,但除非我重新加载列表,否则只允许一次。

我已经尝试过:重新查询不断出现,但现在被认为已过时并且应该避免。我看到一些帖子谈论将查询换成新的,但我一直收到一个空错误,所以我不确定这是否是答案,我只是误解了某些东西或什么。

谢谢,谢谢你们。

【问题讨论】:

    标签: java android listview simplecursoradapter


    【解决方案1】:

    OnClickListener 内的if 语句未检查状态列的最新值。您需要在OnClickListener 中再次阅读它。像这样更改代码:

    checkBoxImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            DBHELPER dbhelper = new DBHELPER(context);
            SQLiteDatabase db = dbhelper.getWritableDatabase();
    
            ContentValues values = new ContentValues();
    
            String[] columns = new String[]{DBHELPER.WISHLIST_COLUMN_NAME, DBHELPER.WISHLIST_COLUMN_GIFT, DBHELPER.WISHLIST_COLUMN_SPECIFICS, DBHELPER.WISHLIST_COLUMN_STORE, DBHELPER.WISHLIST_COLUMN_URL, DBHELPER.WISHLIST_COLUMN_STATUS};
            Cursor cursor2 =  db.query(DBHELPER.WISHLIST_TABLE_NAME, columns, null, null, null, null, null);
    
            String status2 = cursor2.getString(cursor2.getColumnIndex(DBHELPER.WISHLIST_COLUMN_STATUS));
    
            if("true".equals(status2)) {
                values.put(DBHELPER.WISHLIST_COLUMN_NAME, name2);
                values.put(DBHELPER.WISHLIST_COLUMN_GIFT, gift);
                values.put(DBHELPER.WISHLIST_COLUMN_SPECIFICS, specs);
                values.put(DBHELPER.WISHLIST_COLUMN_STORE, store);
                values.put(DBHELPER.WISHLIST_COLUMN_URL, url);
                values.put(DBHELPER.WISHLIST_COLUMN_STATUS, "false");
    
                db.update(DBHELPER.WISHLIST_TABLE_NAME, values,"_ID " + "='" + id + "'", null);
                Message.message(context, "FALSE UPDATED");
    
                ImageButton checkBoxImage = (ImageButton) v.findViewById(R.id.ID_ROW_CHECKBOX);
                checkBoxImage.setImageResource(R.drawable.icon_no);
            } else {
                values.put(DBHELPER.WISHLIST_COLUMN_NAME, name2);
                values.put(DBHELPER.WISHLIST_COLUMN_GIFT, gift);
                values.put(DBHELPER.WISHLIST_COLUMN_SPECIFICS, specs);
                values.put(DBHELPER.WISHLIST_COLUMN_STORE, store);
                values.put(DBHELPER.WISHLIST_COLUMN_URL, url);
                values.put(DBHELPER.WISHLIST_COLUMN_STATUS, "true");
    
                ImageButton checkBoxImage = (ImageButton) v.findViewById(R.id.ID_ROW_CHECKBOX);
                checkBoxImage.setImageResource(R.drawable.icon_yes);
    
                System.out.println("BEFORE : " + status2);
                db.update(DBHELPER.WISHLIST_TABLE_NAME, values,"_ID " + "='" + id + "'", null);
                Message.message(context, "TRUE UPDATED");
            }
    
            db.close();
        }
    });
    

    【讨论】:

    • 谢谢你,玛拉特。您很好地解释了问题,同时继续清理了我的代码,因此我没有重用相同的行。我很感激! PS:不能投票,因为没有足够的代表,但我继续选择你的答案为最佳,干杯!
    【解决方案2】:

    以下代码应放在onClick 方法内:

     if(status.equals("true"))
        {
            checkBoxImage.setImageResource(R.drawable.icon_yes);
        } else {
            checkBoxImage.setImageResource(R.drawable.icon_no);
        }
    

    顺便说一句,您的代码应该更简洁。 values的声明必须在if statement之外

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多