2016-11-01 2 views
0

GridView을 사용하여 로컬 데이터베이스에 저장된 이미지 격자를 표시하는 앱을 작성하고 있습니다. 데이터베이스의 격자 이미지를 삭제하는 버튼에 의해 트리거 된 deleteSelectedImage 메소드를 구현했습니다. 삭제가 작동하지만 내 GridView을 새로 고치지 못합니다 ... 활동을 닫은 다음 다시 열면 변경 사항이 표시됩니다. 활동Android GridView - notifyDataSetChanged GridView를 새로 고침하지 않습니다.

:

mBaseAdapter = new ImageAdapter(this, c, db); 
mGridView.setAdapter(mBaseAdapter); 
: 나는 또한이 시도

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

: 여기

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 클래스의 코드는 다음

내 코드입니다

대신 :

mBaseAdapter.notifyDataSetChanged(); 

하지만 작동하지 않았습니다.

+1

여기서 'deleteSelectedImage'를 (를) 호출 하시겠습니까? 이 버튼이나 당신이 말하는 버튼이 보이지 않습니다. – TWL

답변

0

잘못 구현했습니다. 삭제 후에도 커서의 데이터는 동일합니다. 커서의 데이터는 onCreate()가 다시 호출 될 때만 업데이트됩니다. 데이터 삭제 후 deleteSelectedImage 메서드에서 커서를 업데이트 한 다음 notifyDataSetChanged를 호출하거나 생성자에서 커서 대신 목록을 전달하려고 시도하고 삭제하는 동안 목록과 데이터베이스에서 데이터를 삭제 한 다음 notifyDataSetChanged를 호출하십시오.

관련 문제