2016-11-01 4 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.

Смежные вопросы