Usunięte obiekty po odświeżeniu nadal wyświetlają się w RecyclerView po usunięciu [+Glide i BD]

0

Cześć.

Tak jak w temacie, podczas próby pisania swojej apki mam problem, że gdy (kody poniżej ;) ) usuwam w RecyclerAdapterze pojdynczy obiekt (zdjecie) wszystko początkowo wygląda dobrze (dana "karta" reprezentująca zdjęcie znika) po czym po załadowaniu od nowa fragmentu z listą dane zdjęcie(karta) pojawia się ponownie. Zdjęcia przechowuje według takiej logiki:

  • same pliki ze zdjęciami przechowuje w katalogu aplikacji (tym który jest odinstalowany i czyszczony przy odinstalowywaniu -> może w tym jest problem?)
  • w bazie danych przechowuję ścieżkę do tego zdjęcia wraz z dodatkowymi informacjami
    -Glid'em ładuje zdjęcia do imageView
    -informacje o zdjęciach przechowuje na liście w formie obiektów klasy MyFunnyImg
    -mam ContentProvidera
    -chyba niczego nie pominąłem bo miałem trochę przerwy od tego kodu -> jak coś to proszę pisać to dokleję więcej kodu :)
    Poniżej "robocze" kody:
// metoda delete z ContentProvidera
@Override
public int delete(@NonNull Uri uri, @Nullable String where, @Nullable String[] whereArgs) {
    int numbersOfRowsDeleted=0;
    switch (uriMatcher.match(uri)) {
        case ONE_PIC:
            numbersOfRowsDeleted=dbHelper.getWritableDatabase().delete(DatabaseDescription.Picture.TABLE_NAME_,
                   DatabaseDescription.Picture._ID+"="+uri.getLastPathSegment(),whereArgs);

            break;
        default:
            unsupportedOperation();
    }
    if(numbersOfRowsDeleted>0){
        getContext().getContentResolver().notifyChange(uri,null);
    }
    return numbersOfRowsDeleted;
}

// logika usuwania ppjdeynczego zdjecia
private boolean onSingleMenuItemClick(MenuItem item,ImageView imageView,int position){
    int id=item.getItemId();
    switch (id){
        case R.id.share:
           // instructions
            break;
        case R.id.more_info:
           // instructions
            break;
        case R.id.delete_img:
            deleteImg(position);
            break;
        default:
            //instructions
    }
    return true;
}



private void deleteImg(int position){
    removeImgFile(argsToShow.get(position).getFileName());
    deleteFromDatabase(position);
    argsToShow.remove(position);
    //notifyDataSetChanged();
   // notifyItemRemoved(position);

    notifyItemRangeChanged(position,argsToShow.size());
}`private void removeImgFile(String fName){



    String root=null;
    try {
        root = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString();
    }catch(NullPointerException ex){
        ex.printStackTrace();
        Log.e("Error","NullPointerException while deleting BitMap");
    }




    File dir=new File(root+"/saved_images");

    File file=new File(dir,fName);

}

"Na piechotę" wybadałem (przez wartości zwracane przez metody delete dla BD i pliku że wszystko powinno ładnie się skasować) a mimo wszystko obrazek nadal się pojawia -> może coś z Glide ?

  • wersje z powiadamianiem "słuchaczy" -> notify testowałem i zawsze taki sam efekt, ale zostawia w formie komentarzy.
    Dziękuję za wszystkie konstruktywne sugestie.
0

dodaj

boolean deleted = file.delete();

gdzie ladujesz te rekordy do bazy danych?

0

i czy na pewno
DatabaseDescription.Picture._ID
jest takie samo jak uri.getLastPathSegment()

tzn wydaje mi sie ze getLastPathSegment to po prostu jakas nazwa pliku i bedzie ona rozna od ID, wiec nic sie nie usunie z bazy. ciezko powiedziec bo nie wiadomo co tam zapisujesz

0

Sprawdziłem i id są równe, zobaczyłem też w adb czy te pliki faktycznie się usuwają - i się usuwają a mimo wszystko potem się wyświetlają, poniżej wstawiam kod wstawiający do bazy danych (oraz link do repozytorium na GitHubie gdzie w sumie jest cała apka ) :

public class ImageSaverThread extends AsyncTask<Object,Void,Boolean> {

    private final String DIR_NAME_="/saved_images";

    private Activity activity; 

    public ImageSaverThread(Activity activity){
        this.activity=activity;
    }

    @Override
    protected Boolean doInBackground(Object... voids) {
        ImageView preview=null;
        RelativeLayout relative=null;

        if(voids[0] instanceof ImageView){
            preview=(ImageView)voids[0];
        }
        if(voids[1] instanceof RelativeLayout){
            relative=(RelativeLayout)voids[1];
        }

        if(preview == null || relative == null) return false;


        //getting BitMap from ImageView
        Bitmap imageToSave=((BitmapDrawable)preview.getDrawable()).getBitmap();

        String root=null;
        try {
            root = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString();
        }catch(NullPointerException ex){
            ex.printStackTrace();
            Log.e("Error","NullPointerException while savign the Pic");
            return false;
        }

        File dir=new File(root+DIR_NAME_);
        dir.mkdirs();
        String fileNam=""+System.currentTimeMillis(); //timestamp as an file name
        File fileSav=new File(dir,fileNam);

        FileOutputStream out=null;

        if (activity.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            Log.i("Info","Asking for permission to write if not granted yet");
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},4200);
        }

        try {
            out = new FileOutputStream(fileSav);
            //saving compressed file ot the dir
            imageToSave.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            Log.e("PicsChooserFrag", "Error during saving to SD");
            return false;
        }

        
        return  saveImgInfoToDb(root, fileNam,activity, relative);

    }

    private boolean saveImgInfoToDb(String root, String fileNam, Activity activity,RelativeLayout relative){
        // we create URI referrimng to whole table
        Uri uri= DatabaseDescription.Picture.CONTENT_URI;

        EditText etName,etDescription;

        etDescription=(EditText)relative.findViewById(R.id.image_description);
        etName=(EditText)relative.findViewById(R.id.image_name);

        ContentResolver contentResolver=activity.getContentResolver();



        String wholePath=root+"/"+fileNam;

        ContentValues values=new ContentValues();

        //name - inserted by user in TextView
        values.put(DatabaseDescription.Picture.COLUMN_PIC_NAME,etName.getText().toString());
        //file Name...
        values.put(DatabaseDescription.Picture.COLUMN_FNAME,fileNam);
        //path -> wholePath to read image from file system
        values.put(DatabaseDescription.Picture.COLUMN_PIC_PATH,wholePath);
        //description - inserted by user in TextView
        values.put(DatabaseDescription.Picture.COLUMN_DESCRIPTION,etDescription.getText().toString());


        contentResolver.insert(uri,values);
        Log.i("Image Saver: ","Image saved");
        return true;
    }



https://github.com/TomKo1/Gallery/tree/Creating_DB

1 użytkowników online, w tym zalogowanych: 0, gości: 1