为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2023-03-09 17:08:33
我正在开发一款寻宝游戏应用程序,该应用程序会在回收站视图中显示要拍摄的物品列表。该列表是从 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);        }我的相机来自 MainActivityprivate 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);        }    }}
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

发生这种情况是因为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);


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号