Когда я пытаюсь отобразить изображение, снятое с камеры, в режиме просмотра, изображение появляется в несколько строк - PullRequest
1 голос
/ 07 июля 2019

Я работаю над приложением по поиску мусора, которое отображает список предметов, которые нужно сфотографировать в обзоре переработчика.Список загружается из Firebase.Существует onClickListener, поэтому при нажатии на один из элементов в списке он открывает камеру, затем вы фотографируете, и я хочу отобразить изображение рядом с выбранным элементом.Прямо сейчас, когда я делаю фотографию, она отображается в нескольких строках в окне повторного просмотра.Например, если я выберу 0-й элемент в списке и сделаю снимок, изображение будет отображаться как для 0-го элемента, так и для 11-го элемента в списке.Я пытаюсь заставить его отображаться только на выбранном элементе.

Я пытался использовать adapter.notifyDataSetChanged () и adapter.notifyItemChanged (tmpPosition) после добавления изображения, но оба из них отображают изображение в несколько строк.Я знаю, что обновляется только один элемент в списке.Способ, которым я делаю это прямо сейчас, заключается в том, что я создал глобальную переменную int под названием tmpPosition.Когда вы щелкаете элемент в списке, я устанавливаю 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);
        }
    }
}

private File createPhotoFile() {
    String name = new SimpleDateFormat(Constants.PHOTO_DATE_NAME_FORMAT).format(new Date());
    File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);  //the directory where we will be storing the pic
    File image = null;

    try {
        image = File.createTempFile(name, ".jpg", storageDir);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return image;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

        Bitmap imageTaken = BitmapFactory.decodeFile(pathToFile);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        imageTaken.compress(Bitmap.CompressFormat.JPEG, Constants.IMAGE_THUMBNAIL_QUALITY, bos);

        if (tmpPosition > -1) {
            scavengerHuntItemsList.get(tmpPosition).setScavengerHuntImage(imageTaken);
            adapter.notifyDataSetChanged();
            tmpPosition = -1;
        }

    }
}

Ниже приведен мой адаптер повторного просмотра. Я установил изображение в onBindViewHolder

public class ScavengerHuntRecyclerAdapter extends RecyclerView.Adapter<ScavengerHuntRecyclerAdapter.ScavengerHuntViewHolder> {

private ArrayList<ScavengerHuntItem> scavengerHuntArrayList;
private static ClickListener clickListener;


private RecyclerView.AdapterDataObserver dataObserver = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        super.onItemRangeChanged(positionStart, itemCount);
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) {
        super.onItemRangeChanged(positionStart, itemCount, payload);
    }

    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        super.onItemRangeInserted(positionStart, itemCount);
    }

    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        super.onItemRangeRemoved(positionStart, itemCount);
    }

    @Override
    public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
        super.onItemRangeMoved(fromPosition, toPosition, itemCount);
    }
};

public static class ScavengerHuntViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView scavengerHuntLayoutTextView;
    public ImageView scavengerHuntLayoutImageView;

    public ScavengerHuntViewHolder(@NonNull View itemView) {
        super(itemView);

        itemView.setOnClickListener(this);
        scavengerHuntLayoutTextView = itemView.findViewById(R.id.scavengerHuntLayoutTextView);
        scavengerHuntLayoutImageView = itemView.findViewById(R.id.scavengerHuntLayoutImageView);

    }

    @Override
    public void onClick(View v) {
        clickListener.onItemClick(getAdapterPosition(), v);
    }
}

public void setOnItemClickListener(ClickListener clickListener) {
    ScavengerHuntRecyclerAdapter.clickListener = clickListener;
}

public interface ClickListener {
    void onItemClick(int position, View v);
}

public ScavengerHuntRecyclerAdapter(ArrayList<ScavengerHuntItem> scavengerHuntArrayList) {
    this.scavengerHuntArrayList = scavengerHuntArrayList;
}

@NonNull
@Override
public ScavengerHuntViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.scavenger_hunt_list_layout, viewGroup, false);
    ScavengerHuntViewHolder scavengerHuntViewHolder = new ScavengerHuntViewHolder(view);
    return scavengerHuntViewHolder;
}

@Override
public void onBindViewHolder(@NonNull ScavengerHuntViewHolder scavengerHuntViewHolder, int i) {
    ScavengerHuntItem currentItem = scavengerHuntArrayList.get(i);
    scavengerHuntViewHolder.scavengerHuntLayoutTextView.setText(currentItem.getDescription());

    if (currentItem.getScavengerHuntImage() != null) {
        scavengerHuntViewHolder.scavengerHuntLayoutImageView.setImageBitmap(currentItem.getScavengerHuntImage());
        Log.d("in adapter UPDATED POS", "position  =  " + i);
    }
}



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

}

1 Ответ

0 голосов
/ 07 июля 2019

Это происходит потому, что 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);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...