当我尝试在 recyclerview 上显示从相机拍摄的图像时,图像出现多行

我正在开发一款寻宝游戏应用程序,该应用程序会在回收站视图中显示要拍摄的物品列表。该列表是从 Firebase 加载的。有一个 onClickListener,因此当单击列表中的一个项目时,它会打开相机,然后您拍照,我想在所选项目旁边显示图像。现在,当我拍照时,它会在回收视图中显示在多行上。例如,如果我选择列表中的第 0 项并拍照,则该图片将同时显示在列表中的第 0 项和第 11 项上。我试图让它只显示在所选项目上。


我在添加图像后尝试使用 adapter.notifyDataSetChanged() 和 adapter.notifyItemChanged(tmpPosition) 但它们都在多行上显示图像。我知道只有列表中的一项得到更新。我现在的做法是创建一个名为 tmpPosition 的全局 int 变量。当您单击列表中的项目时,我将 tmpPosition 设置为等于所选项目的索引。然后在 onActivityResult 中,我使用以下方法设置图像:


scavengerHuntItemsList.get(tmpPosition).setScavengerHuntImage(imageTaken);

adapter.notifyDataSetChanged();

从我的 MainActivity 这是打开相机的 onClickListener


     ((ScavengerHuntRecyclerAdapter) dapter).setOnItemClickListener(new 

     ScavengerHuntRecyclerAdapter.ClickListener() {

                @Override

                public void onItemClick(int position, View v) {

                    //Here I am saving the position of the item so later I can update the correct index in the list

                    tmpPosition = position;


                    dispatchTakePictureIntent();


                }

            });

            scavengerHuntMainRecyclerView.setAdapter(adapter);

        }

我的相机来自 MainActivity


private void dispatchTakePictureIntent() {

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);


    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

        File photoFile = null;

        photoFile = createPhotoFile();

        if (photoFile != null) {

            pathToFile = photoFile.getAbsolutePath(); //gets the path to the image

            Uri photoURI = FileProvider.getUriForFile(ScavengerHuntMainActivity.this, "com.example.test", photoFile);

            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

        }

    }

}

慕标5832272
浏览 104回答 1
1回答

慕村9548890

发生这种情况是因为RecyclerView重用了它的视图(项目/单元格)。单元格 1 的内容因此在单元格 11 中重复使用,导致照片出现多次。这可以通过清除内容来解决ImageView。if (currentItem.getScavengerHuntImage() != null) {        scavengerHuntViewHolder.scavengerHuntLayoutImageView.setImageBitmap(currentItem.getScavengerHuntImage());        Log.d("in adapter UPDATED POS", "position  =  " + i);    } else {scavengerHuntViewHolder.scavengerHuntLayoutImageView.setImageResource(android.R.color.transparent);//or//scavengerHuntViewHolder.scavengerHuntLayoutImageView.setImageBitmap(null);} 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java