Элементы RecyclerView теряются после возвращения к активности - PullRequest
0 голосов
/ 24 января 2019

В моем приложении, когда пользователь нажимает кнопку « Добавить изображения », оно позволяет пользователю выбирать изображения из галереи и загружать их в представление Recycler. Но когда пользователь возвращается к предыдущему действию, нажав кнопку «Назад», и снова нажимает кнопку « Добавить изображения », ранее выбранные изображения теряются из Recyclerview. Я попытался onSavedInstanceState (), но это не работает в моем случае. Я проверил различные решения StackOverflow, но у меня ничего не работает.

Вот мое основное занятие под названием RecorderActivity

public class RecorderActivity extends AppCompatActivity {
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.add_images) {
            Intent intent = new Intent(context,GridViewActivity.class);
            intent.putExtra("call","1");
            startActivity(intent);
        }
        else if(item.getItemId()==R.id.add_pdf_ppt) {
            Toast.makeText(context, "Under Development", Toast.LENGTH_SHORT).show();
        }
        else if(item.getItemId()==R.id.rearrange_items) {
            Intent i=new Intent(RecorderActivity.this,GridViewActivity.class);
            i.putExtra("call","2");
            startActivity(i);
        }
        return super.onOptionsItemSelected(item);
    }
}

Здесь при нажатии кнопки параметров « Добавить изображения » на панели инструментов открывается GridViewActivity, где пользователь может добавлять изображения из галереи, но когда пользователь возвращается к предыдущему действию, то есть RecorderActivity, и нажимает снова « Добавить изображения", ранее выбранные изображения будут потеряны из recyclerView.

Вот мой код GridViewActivity

Это обновленный код, в котором я сохранил ArrayList в общих настройках с помощью Gson и в методе onCreate (). Я извлек ArrayList из sharedPreferences и установил его в представление переработчика, но в обзоре утилит отображаются только карты, а не изображения внутри карты. Это проблема! В sharedPreferences я использую одну переменную count, чтобы указать общее количество изображений в sharedPreferences.

public class GridViewActivity extends AppCompatActivity {
    Context context=GridViewActivity.this;
    RecyclerView recyclerView;
    int PICK_IMAGE_MULTIPLE=1;
    static ArrayList<Images> arrayList;
    static ImagesAdapter imagesAdapter;
    AutoFitGridLayoutManager autoFitGridLayoutManager;
    SharedPref sharedPref;
    @Override
    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());
            Log.d("ROHIT", String.valueOf(arrayList.size()));
            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);
    }

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.add_imges_cam) {
            //open camera
        }
        else if(item.getItemId()==R.id.add_imges_gallery) {
            //open gallery to select images
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);
        }
        return super.onOptionsItemSelected(item);
    }

    @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);
            Log.d("ROHIT","data saved arraylist"+arrayList.size());
            sharedPref.updateCount(count);
            Log.d("ROHIT","data saved");
            setRecyclerView();
        }
    }

}

Это SharedPref.java

public class SharedPref {
    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    Context context;

    public SharedPref(Context context) {
        this.context=context;
        sharedPreferences=context.getSharedPreferences("Grid_images",Context.MODE_PRIVATE);
        editor=sharedPreferences.edit();
    }

    public void save(ArrayList<Images> arrayList) {
        Gson gson=new Gson();
        Object src;
        String json=gson.toJson(arrayList);
        editor.putString("grid_images",json);
        editor.apply();
        editor.commit();
    }

    public void updateCount(int i) {
        editor.putInt("images_count",i);
        editor.apply();
        editor.commit();
    }

    public int getCount() {
        return sharedPreferences.getInt("images_count",0);
    }

    public String getImages() {
        return sharedPreferences.getString("grid_images",null);
    }

Это класс Images.java

public class Images implements Parcelable {
    private String image;

    public Images(String image) {
        this.image=image;
    }

    protected Images(Parcel in) {
        image = in.readString();
    }

    public static final Creator<Images> CREATOR = new Creator<Images>() {
        @Override
        public Images createFromParcel(Parcel in) {
            return new Images(in);
        }

        @Override
        public Images[] newArray(int size) {
            return new Images[size];
        }
    };

    public String getImage() {
        return image;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(String.valueOf(image));
    }
}

Это код класса ImageAdapter

public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.MyViewHolder> implements ItemMoveCallback.ItemTouchHelperContract {
    ArrayList<Images> images;
    Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        View rowView;
        ImageButton bt_remove;
        public MyViewHolder(View itemView) {
            super(itemView);
            rowView=itemView;
            imageView=itemView.findViewById(R.id.imageview);
            bt_remove=itemView.findViewById(R.id.bt_delete);
        }
    }

    public ImagesAdapter(Context context,ArrayList<Images> images) {
        this.context=context;
        this.images=images;
    }

    public ImagesAdapter(Context context) {
        this.context=context;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.images_grid,parent,false);
        MyViewHolder myViewHolder=new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        Images current_image=images.get(position);
        holder.imageView.setImageURI(Uri.parse(current_image.getImage()));

        holder.bt_remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                images.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position,images.size());
            }
        });
    }

    @Override
    public int getItemCount() {
        return images.size();
    }

    @Override
    public void onRowMoved(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(images, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(images, i, i - 1);
            }
        }
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public void onRowSelected(MyViewHolder myViewHolder) {
        myViewHolder.rowView.setBackgroundColor(context.getResources().getColor(R.color.recycler_drag));
    }

    @Override
    public void onRowClear(MyViewHolder myViewHolder) {
        myViewHolder.rowView.setBackgroundColor(Color.WHITE);
    }
}

Вот вывод:

После выбора 4 изображений из галереи оно отображается в программе просмотра в GridViewActivity. enter image description here

Но после нажатия кнопки «Назад» и перехода в GridViewActivity снова отображается окно повторного просмотра enter image description here

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

Ответы [ 2 ]

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

Замените свою активность этим и попробуйте:

public class GridViewActivity extends AppCompatActivity {
    Context context=GridViewActivity.this;
    RecyclerView recyclerView;
    int PICK_IMAGE_MULTIPLE=1;
    static ArrayList<Images> arrayList;
    static ImagesAdapter imagesAdapter;
    AutoFitGridLayoutManager autoFitGridLayoutManager;
    SharedPref sharedPref;
    @Override
    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<>();                        // move this line above adapter initialization
        imagesAdapter=new ImagesAdapter(context,arrayList);

        setRecyclerView();                               // forgot to invoke this method here. 

        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());
            Log.d("ROHIT", String.valueOf(arrayList.size()));
            imagesAdapter.notifyDataSetChanged();    // change is here
        }
    }

    public void setRecyclerView() {
        ItemTouchHelper.Callback callback=new ItemMoveCallback(imagesAdapter);
        ItemTouchHelper touchHelper=new ItemTouchHelper(callback);
        touchHelper.attachToRecyclerView(recyclerView);
        recyclerView.setAdapter(imagesAdapter);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.add_imges_cam) {
            //open camera
        }
        else if(item.getItemId()==R.id.add_imges_gallery) {
            //open gallery to select images
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);
        }
        return super.onOptionsItemSelected(item);
    }

    @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();
                    }
                }
            }

            sharedPref.save(arrayList);
            Log.d("ROHIT","data saved arraylist"+arrayList.size());
            sharedPref.updateCount(count);
            Log.d("ROHIT","data saved");
            imagesAdapter.notifyDataSetChanged();
        }
    }

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

Это происходит потому, что вы создаете новый ArrayList каждый раз, когда возвращаетесь из Галереи.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    arrayList=new ArrayList<>();
    ...
    // and then you are re-initializing your recycler view 
    imagesAdapter=new ImagesAdapter(context,arrayList);
    setRecyclerView();

Таким образом, когда пользователь не выбирает какое-либо изображение из галереи, тогда внутри onActivityResult() вы не получаете никакого изображения URI, но перед этим вы создаете новый ArrayList и повторно инициализируете свое окно повторного использования.

Именно поэтому в вашем представлении переработчика нет элементов.

Сохраните этот ArrayList как переменную члена класса и продолжайте добавлять / удалять данные, основываясь на onActivityResult ().

...