Я работаю над приложением, которое извлекает информацию из базы данных SQLite и отображает ее в RecyclerView. У меня возникли проблемы с настройкой изображения в RecyclerView с использованием URI.
Uri mImageUri=data.getData();
imgUri = data.getData();
// Get path (Path will be stored in database)
String imgToString = imgUri.toString();
// Get URI back from path
imgUri = Uri.parse(imgToString);
// Set ImageView
plainImage.setImageURI(imgUri);
// Set Glide image
Glide.with(this)
.asBitmap()
.load(imgUri)
.into(image);
Это фрагмент моего OnActivityResult() после выбора изображений из галереи. Установка изображений в базовом действии с использованием этого кода работает. Я беру toString() из URI и сохраняю его в своей базе данных. (Я буду перемещать выбранные изображения в папку приложения, прежде чем принимать URI в окончательной версии приложения)
Однако, когда я извлекаю строки URI из базы данных, анализирую их обратно в URI и пытаюсь установить изображение в RecyclerView, этот метод больше не работает.
Вот OnBindViewHolder() из RecyclerAdapter
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder: called.");
// Load only first image for now
if(mImages.get(position).size() > 0) {
tempUri = Uri.parse(mImages.get(position).get(0));
// Make glide work with image
Glide.with(mContext)
.asBitmap()
.load(tempUri)
.into(holder.image);
// With regular ImageView
holder.imageViewTest.setImageURI(tempUri);
}
holder.weight.setText(mWeights.get(position).toString());
holder.location.setText(mLocations.get(position));
holder.confidence.setText(mConfidences.get(position).toString());
// Open item view
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, ItemView.class);
// Attach additional data to intent
intent.putExtra("image_url", mImages.get(position));
intent.putExtra("location", mLocations.get(position));
intent.putExtra("confidence", mConfidences.get(position));
intent.putExtra("weight", mWeights.get(position));
mContext.startActivity(intent);
}
});
}
URI выглядит нормально при проверке переменной. Что может быть причиной этого и как я могу установить изображения в RecyclerView?
Спасибо
ИЗМЕНИТЬ
Вот код адаптера
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private static final String TAG = "RecyclerViewAdapter";
private ArrayList<ArrayList<String>> mImages;
private ArrayList<Float> mWeights;
private ArrayList<Float> mConfidences;
private ArrayList<String> mLocations;
private ArrayList<Integer> mSharkEntryIds;
private Context mContext;
private Uri tempUri;
public RecyclerViewAdapter(Context context, ArrayList<Integer> ids, ArrayList<ArrayList<String>> images, ArrayList<Float> weights
, ArrayList<Float> confidences, ArrayList<String> locations) {
this.mContext = context;
this.mSharkEntryIds = ids;
this.mImages = images;
this.mWeights = weights;
this.mLocations = locations;
this.mConfidences = confidences;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_list_item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder: called.");
// Load only first image for now
if(mImages.get(position).size() > 0) {
tempUri = Uri.parse(mImages.get(position).get(0));
// Make glide work with image
Glide.with(mContext)
.asBitmap()
.load(tempUri)
.into(holder.image);
}
holder.weight.setText(mWeights.get(position).toString() + " kg");
holder.location.setText(mLocations.get(position));
holder.confidence.setText(mConfidences.get(position).toString() + " %");
// Open item view
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, ItemView.class);
// Attach additional data to intent
intent.putExtra("id", mSharkEntryIds.get(position));
intent.putExtra("image_url", mImages.get(position));
intent.putExtra("location", mLocations.get(position));
intent.putExtra("confidence", mConfidences.get(position));
intent.putExtra("weight", mWeights.get(position));
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mImages.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
CircleImageView image;
TextView weight;
TextView confidence;
TextView location;
RelativeLayout parentLayout;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.thumbnail);
weight = itemView.findViewById(R.id.biomassText);
confidence = itemView.findViewById(R.id.confidenceText);
location = itemView.findViewById(R.id.locationText);
parentLayout = itemView.findViewById(R.id.parent_layout);
}
}
}
Вот код, в котором я инициализирую RecyclerView
// Vars
private ArrayList<Integer> mSharkEntryIds = new ArrayList<>();
private ArrayList<String> mLocations = new ArrayList<>();
//private ArrayList<String> mImageUrls = new ArrayList<>();
private ArrayList<ArrayList<String>> mImagePaths = new ArrayList<>();
private ArrayList<Float> mConfidences = new ArrayList<>();
private ArrayList<Float> mWeights = new ArrayList<>();
private DatabaseHelper mDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
mDatabaseHelper = new DatabaseHelper(this);
Log.d(TAG, "onCreate: started");
//initImageBitmaps();
// Populate list view
Cursor data = mDatabaseHelper.getSharkEntriesFromDatabase();
while(data.moveToNext()){
mSharkEntryIds.add(data.getInt(0));
mWeights.add(data.getFloat(1));
mLocations.add(data.getString(2));
mConfidences.add(data.getFloat(3));
}
Log.d(TAG, "onCreate: test");
// Get associated image paths
ArrayList<String> photosForEntry;
for(Integer id : mSharkEntryIds){
data = mDatabaseHelper.getPhotosWithSharkID(id);
photosForEntry = new ArrayList<>();
while(data.moveToNext()){
photosForEntry.add(data.getString(0));
}
mImagePaths.add(photosForEntry);
}
initRecyclerView();
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: init recyclerview");
RecyclerView recyclerView = findViewById(R.id.recycler_view);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mSharkEntryIds, mImagePaths, mWeights, mConfidences, mLocations);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}