Я работаю над приложением по поиску мусора, которое отображает список предметов, которые нужно сфотографировать в обзоре переработчика.Список загружается из 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();
}
}