Изображения из галереи не отображаются в RecycleView - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь сохранить imagePath с комнатой Android.Итак, у меня есть две действия, во-первых, это место, где все выбранные изображения отображаются в RecycleView, а во-вторых, где пользователь может нажать на заполнитель изображения, а затем выбрать изображение из галереи. И изображение остается после того, как он вернулся. Затем нажмите СохранитьFOB и вернитесь к первому действию. Если пользователь захочет заменить, он нажмет на изображение в режиме повторного просмотра и снова коснется предварительно выбранного изображения и снова выберет другое из галереи.Проблема в том, что хотя выбранное изображение остается сохраненным во втором упражнении, в первом действии не отображаются никакие изображения. Только пробел. Если я коснусь места, где должно остаться изображение, оно переключит меня на второе занятие. Так что изображение естьпросто не появляется.

Я пробовал это решение, но оно помогло мне только частично

первый класс:

public class MainActivity extends AppCompatActivity {
private ImageViewModel imageViewModel;
private FloatingActionButton floatingActionButton;
private String imagePath;

public static final int ADD_IMAGE_REQUEST = 1;
public static final int EDIT_IMAGE_REQUEST = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    if (getIntent() != null) {
        imagePath = getIntent().getStringExtra(EXTRA_IMAGE);
    }

    final ImageAdapter imageAdapter = new ImageAdapter(this);
    recyclerView.setAdapter(imageAdapter);
    imageViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);
    imageViewModel.getAllImages().observe(this, new Observer<List<ImageEntity>>() {
        @Override
        public void onChanged(List<ImageEntity> imageEntities) {
            imageAdapter.setImages(imageEntities);
        }
    });

    floatingActionButton = findViewById(R.id.fob);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, AddEditActivity.class);
            intent.putExtra("whichRequest", ADD_IMAGE_REQUEST);
            startActivity(intent);
            finish();
        }
    });
    imageAdapter.setOnClickListener(new ImageAdapter.OnItemClickListener() {
        @Override
        public void onItemClicked(ImageEntity imageEntity) {
            Intent intent = new Intent(MainActivity.this, AddEditActivity.class);
            intent.putExtra(AddEditActivity.EXTRA_ID, imageEntity.getId());
            intent.putExtra(EXTRA_IMAGE, imageEntity.getImgePath());
            intent.putExtra("whichRequest", EDIT_IMAGE_REQUEST);
            startActivity(intent);
        }
    });
}

второй класс:

public class AddEditActivity extends AppCompatActivity {
    public static final String EXTRA_IMAGE = "package com.example.imagesaver.EXTRA_IMAGE";
    public static final String EXTRA_ID = "package com.example.imagesaver.EXTRA_ID";
    public static final int PICK_IMAGE = 1;
    private String imageUriString;
    private ImageView imageView;
    private FloatingActionButton floatingActionButton;
    private Uri selectedImageUri;
    private int imageId;
    private int whichREquest;
    private ImageViewModel imageViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_edit_layout);
        imageView = findViewById(R.id.image);
        imageViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);

        Intent intent = getIntent();
        if (getIntent() != null) {
            imageUriString = getIntent().getStringExtra(EXTRA_IMAGE);
            imageId = getIntent().getIntExtra(EXTRA_ID, 0);
            whichREquest = getIntent().getIntExtra("whichRequest", 0);
        }
        if (intent.hasExtra(EXTRA_ID)) {

            setTitle("Edit");
            imageView.setImageURI(Uri.parse(imageUriString));

        } else {

            setTitle("Add");
            invalidateOptionsMenu();
        }
            floatingActionButton = findViewById(R.id.fob_save);
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveImage();
            }
        });


        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_OPEN_DOCUMENT );
                startActivityForResult(Intent.createChooser(intent, "select a picture"), PICK_IMAGE);
                Toast.makeText(AddEditActivity.this, "izaberi jednu sliku", Toast.LENGTH_SHORT).show();
            }
        });
    }


    private void saveImage() {
        if (whichREquest == 1){
            ImageEntity imageEntity = new ImageEntity(selectedImageUri.toString());
            imageViewModel.insert(imageEntity);
            Toast.makeText(this, "Note is saved", Toast.LENGTH_SHORT).show();
        }else {

            if (imageId == -1) {
                Toast.makeText(this, "Note can not be updated", Toast.LENGTH_SHORT).show();
                return;
            }
            ImageEntity imageEntity = new ImageEntity(selectedImageUri.toString());
            imageEntity.setId(imageId);
            imageViewModel.update(imageEntity);
            Toast.makeText(this, "Note is updated", Toast.LENGTH_SHORT).show();
        }

        Intent intent = new Intent(AddEditActivity.this, MainActivity.class);
        int id = getIntent().getIntExtra(EXTRA_ID, -1);
        //ovde proveravamo da id nije -1.
        //samo ako je to istina onda stavljamo id
        if (id != -1) {
            intent.putExtra(EXTRA_ID, id);
        }

        startActivity(intent);
        finish();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
            selectedImageUri = data.getData();
            imageUriString = selectedImageUri.toString();
            imageView.setImageURI(selectedImageUri);

        }
    }
}

мой класс адаптера:

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {
    private List<ImageEntity> listaSlika = new ArrayList<>();
    private Context context;
    private OnItemClickListener listener;

    public ImageAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_item, parent, false);
        return new ImageViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        ImageEntity currentNote = listaSlika.get(position);
        holder.imageView.setImageURI(Uri.parse(new File(currentNote.getImgePath()).toString()));
        Glide.with(context)
                .load(new File(currentNote.getImgePath()).toString())
                .into(holder.imageView);
    }
    public void setImages(List<ImageEntity> listaSlika) {
        this.listaSlika = listaSlika;
        notifyDataSetChanged();
    }

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

        //predstvalja poziciju
    public ImageEntity getImaageAtPosition(int position){
        //vraca poziciju itema
        return listaSlika.get(position);
    }
    public class ImageViewHolder extends RecyclerView.ViewHolder{
    private ImageView imageView;

    public ImageViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.single_image_item);
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int position = getAdapterPosition();
                        if (listener!=null && position!=RecyclerView.NO_POSITION){
                            listener.onItemClicked(listaSlika.get(position));
                        }
                    }
                });
    }

}
    public interface OnItemClickListener{
        void onItemClicked(ImageEntity imageEntity);
    }
    public void setOnClickListener(OnItemClickListener listener){
        this.listener = listener;
    }
}

мой logcat:

W/Glide: Load failed for content:/com.android.providers.media.documents/document/image%3A665917 with size [159x1920]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There were 3 causes:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
  Cause (1 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
    Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
      Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917
  Cause (2 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.os.ParcelFileDescriptor, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
    Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
      Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917
  Cause (3 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
 call GlideException#logRootCauses(String) for more detail
    Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...