2016-11-01 6 views
0

GridViewを使用してローカルデータベースに保存された画像のグリッドを表示するアプリを作成しています。私はdeleteSelectedImageメソッドを実装しました。このメソッドは、データベース内のグリッドの特定のイメージを削除するボタンによってトリガされました。削除は機能しますが、自分でGridViewをリフレッシュすることはできません。アクティビティを閉じてもう一度開くと、変更が表示されます。Android GridView - notifyDataSetChanged GridViewをリフレッシュしない

ここに私のコードです:

アクティビティ:

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クラスのコードです:

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; 
    } 
} 

私もこの試みた:

mBaseAdapter = new ImageAdapter(this, c, db); 
mGridView.setAdapter(mBaseAdapter); 

の代わりに:

mBaseAdapter.notifyDataSetChanged(); 

しかし、それは動作しませんでした。

+1

どこから 'deleteSelectedImage'を呼び出していますか?私はこれもあなたが参照しているボタンが表示されません。 – TWL

答えて

0

あなたはそれを間違って実装しています。削除後もカーソル内のデータは同じになります。カーソル内のデータは、onCreate()が再度呼び出されたときにのみ更新されます。データを削除した後にdeleteSelectedImageメソッドのカーソルを更新してから、notifyDataSetChangedを呼び出すか、コンストラクタでカーソルの代わりにリストを渡そうとするか、削除中にリストとデータベースからデータを削除してからnotifyDataSetChangedを呼び出します。