首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android GridView - notifyDataSetChanged不刷新GridView

Android GridView - notifyDataSetChanged不刷新GridView
EN

Stack Overflow用户
提问于 2016-11-01 20:24:53
回答 1查看 775关注 0票数 0

我正在编写一个应用程序,它使用GridView显示存储在本地数据库中的图像网格。我实现了由一个按钮触发的deleteSelectedImage方法,该按钮删除数据库中网格的给定图像。删除工作,但我不能让我的GridView自动刷新.如果我关闭该活动,然后再次打开它,则更改是可见的。

这是我的密码:

活动:

代码语言:javascript
复制
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.TextView;

public class GalleryShowActivity extends AppCompatActivity {

    private final String DEBUG_TAG = "GalleryShowActivity";

    private DatabaseHandler db;
    private Cursor c;

    private ImageAdapter mBaseAdapter;
    private TextView selectedImageText;
    private GridView mGridView;

    // currently selected position in the grid
    private int mSelectedPos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery_show);

        db = new DatabaseHandler(this);
        c = db.getCursorOnAllImages(this);
        mBaseAdapter = new ImageAdapter(this, c, db);
        mSelectedPos = -1;

        selectedImageText = (TextView)             findViewById(R.id.selectedImageText);
        selectedImageText.setText("Selected image : NONE");

        mGridView = (GridView) findViewById(R.id.gridview);
        mGridView.setAdapter(mBaseAdapter);
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {

                Log.d(DEBUG_TAG, "IMAGE CLICKED");

                // click selects an image (can be changed later)
                mSelectedPos = position;
                selectedImageText.setText("Selected image : " + (position + 1));
            }
        });
     }


    public void deleteSelectedImage(View view) {
        boolean exists = c.moveToPosition(mSelectedPos);
        if (exists) {
            boolean success = db.deletePointedPicture(c, this);
            if (success) {
                Log.d(DEBUG_TAG, "DELETE SUCCESS");
                mBaseAdapter.notifyDataSetChanged();
                // display a success message...
            }
        } else {
            // display an error...
        }
    }
}

下面是ImageAdapter类的代码:

代码语言:javascript
复制
package ch.epfl.sweng.project;

import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;


class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private Cursor mCursor;
    private DatabaseHandler mHandler;

    ImageAdapter(Context context, Cursor cursor, DatabaseHandler handler) {
        mContext = context;
        mCursor = cursor;
        mHandler = handler;
    }

    @Override
    public int getCount() {
        return mCursor.getCount();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int rowHeight = 200;
        int rowWidth = 300;

        ImageView imageView;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(rowWidth, rowHeight));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        Bitmap bm = mHandler.getImageByIndex(mCursor, position);
        imageView.setImageBitmap(bm);
        imageView.setVisibility(View.VISIBLE);
        return imageView;
    }
}

我也试过这个:

代码语言:javascript
复制
mBaseAdapter = new ImageAdapter(this, c, db);
mGridView.setAdapter(mBaseAdapter);

而不是:

代码语言:javascript
复制
mBaseAdapter.notifyDataSetChanged();

但这不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 21:51:53

你搞错了。即使在删除之后,光标中的数据也将是相同的。只有当再次调用onCreate()时,才会更新游标中的数据。删除数据后更新deleteSelectedImage方法上的游标,然后调用notifyDataSetChanged,或者尝试在构造函数中传递列表而不是游标,同时删除列表和数据库中的数据,然后调用notifyDataSetChanged。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40368059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档