Изображения RecyclerView не отображаются после установки массива из SharedPreferences - PullRequest
0 голосов
/ 29 января 2019

В моем приложении у меня есть два действия 1.RecorderActivity 2. GridViewActivity

В RecorderActivity на панели инструментов есть параметр под названием выбрать изображение , когда эта опция нажата, открывается GridViewActivity.В GridViewActivity у меня есть две опции на панели инструментов, называемые захват изображения с камеры и выбор изображения из галереи.

Когда изображения выбираются из галереи, они отображаются в recyclerView в GridViewActivity, например:

enter image description here

После этого я сохранил этот ArrayList в SharedPreferences.

Это код

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        int count=0;
        if(requestCode==PICK_IMAGE_MULTIPLE && resultCode==RESULT_OK) {
            String[] filePath = {MediaStore.Images.Media.DATA};

            if (data.getData() != null) {
                //if single image is selected
                Uri imageUri = data.getData();
                Cursor cursor = getContentResolver().query(imageUri, filePath, null, null, null);
                cursor.moveToFirst();
                arrayList.add(new Images(imageUri.toString()));
                cursor.close();
            } else {
                if (data.getClipData() != null) {
                    ClipData mClipData = data.getClipData();
                    for (int i = 0; i < mClipData.getItemCount(); i++) {
                        ClipData.Item item = mClipData.getItemAt(i);
                        Uri uri = item.getUri();
                        // Get the cursor
                        Cursor cursor = getContentResolver().query(uri, filePath, null, null, null);
                        // Move to first row
                        cursor.moveToFirst();
                        arrayList.add(new Images(uri.toString()));
                        count++;
                        cursor.close();
                    }
                }
            }
            imagesAdapter=new ImagesAdapter(context,arrayList);
            sharedPref.save(arrayList); //store arraylist in SharedPref
            sharedPref.updateCount(count); //store images count in SharedPref
            Log.d("ROHIT","data saved");
            setRecyclerView();
        }
    }

После этого, когда я нажимал назад и сновакогда я снова щелкнул по опции выбора изображения в RecorderActivity, GridviewActivity открылась, но теперь карты RecyclerView просто пустые, изображение не отображается в нем.

enter image description here

Этокод, в котором я возвращаю ArrayList из SharedPref в onCreate ()

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grid_view);
    recyclerView=findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    autoFitGridLayoutManager=new AutoFitGridLayoutManager(context,250);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setLayoutManager(autoFitGridLayoutManager);
    arrayList=new ArrayList<>();
    sharedPref=new SharedPref(context);
    if (sharedPref.getCount()==0) {
        Toast.makeText(context, "No images...", Toast.LENGTH_SHORT).show();
    }
    else {
        Gson gson=new Gson();
        String response=sharedPref.getImages();
        arrayList=gson.fromJson(response,new TypeToken<ArrayList<Images>>(){}.getType()); //gettign ArrayList back from SharedPref
        Log.d("ROHIT", String.valueOf(sharedPref.getCount()));
        Log.d("ROHIT", String.valueOf(arrayList.size())); //arraylist size is also correct after getting it from SharedPref
        imagesAdapter=new ImagesAdapter(context,arrayList);
        setRecyclerView();
    }
}
public void setRecyclerView() {
    ItemTouchHelper.Callback callback=new ItemMoveCallback(imagesAdapter);
    ItemTouchHelper touchHelper=new ItemTouchHelper(callback);
    touchHelper.attachToRecyclerView(recyclerView);
    recyclerView.setAdapter(imagesAdapter);
}

После этого, когда я снова выбираю то же изображение из галереи, оно отображает предыдущее изображение и новое выбранное изображение в RecyclerView.

enter image description here

Скажите, пожалуйста, в чем проблема в моем коде, или скажите, есть ли другой способ добиться этого?шляпа я хочу.

1 Ответ

0 голосов
/ 29 января 2019

Решение действительно простое

Нет необходимости использовать Gson!

Примечание. Я даю вам логику для решения вашей проблемы, однако вам необходимо изменить ее в соответствии с вашим кодом

Попробуйте сделать это при сохранении изображений в общем предпочтении

Bitmap realImage = BitmapFactory.decodeStream(stream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
realImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
byte[] b = baos.toByteArray(); 

String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
textEncode.setText(encodedImage);

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit=shre.edit();
edit.putString("image_data",encodedImage);
edit.commit();

Попробуйте сделать это при получении изображений из общих настроек (подсказка: создайте новый массив списков и создайте цикл, который будет добавлять изображения до достижения последней позиции):

eg :ArrayList<Integer> array_image = new ArrayList<Integer>();
array_image.add(R.drawable.image6);
array_image.add(R.drawable.image1);

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
String previouslyEncodedImage = shre.getString("image_data", "");

if( !previouslyEncodedImage.equalsIgnoreCase("") ){
    byte[] b = Base64.decode(previouslyEncodedImage, Base64.DEFAULT);
    Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
    imageConvertResult.setImageBitmap(bitmap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...