Recyclerview не отправляет изображение

#java #android #image #android-recyclerview

#java #Android #изображение #android-recyclerview

Вопрос:

Я использую этот код для отображения предустановленного изображения в recyclerview, но по какой-то причине оно не отображается. Если у кого-то есть какие-либо исправления, я был бы им очень признателен, если бы они поделились им.

Моя основная активность:

 public class MangadexDisplay extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mangadex_display);
        ArrayList<String> imgUrl = new ArrayList<>();


        RecyclerView recyclerView = findViewById(R.id.mangaRecycler);

        LinearLayoutManager Manager = new LinearLayoutManager(MangadexDisplay.this);
        recyclerView.setLayoutManager(Manager);
        MyAdapter adapter = new MyAdapter(imgUrl, MangadexDisplay.this);
        recyclerView.setAdapter(adapter);

        imgUrl.add("http://thewowstyle.com/wp-content/uploads/2015/01/nature-images..jpg");
        adapter.notifyDataSetChanged();


    }


}
  

Мой MyAdapter.java:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

    ArrayList<String> urls;
    Context context;
    //constructor
    public MyAdapter(ArrayList<String> ImgUrl, Context context_)
    {
        this.urls = ImgUrl;
        this.context = context_;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder
    {
        private final ImageView image;

        public ViewHolder(View v)
        {
            super(v);
            image =(ImageView)v.findViewById(R.id.mangaImage);
        }

        public ImageView getImage(){ return this.image;}
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_mangadex_display, parent, false);
        v.setLayoutParams(new RecyclerView.LayoutParams(1080,800));
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position)
    {
        Glide.with(this.context)
                .load(urls.get(position))
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.getImage());
    }

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

}
  

Если это поможет, я использую glide, как показано выше, для загрузки изображения, если есть другая альтернатива, если это проблема, я был бы рад это услышать.

Вот код макета:

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MangadexDisplay"
    android:orientation="vertical">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/mangaRecycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@ id/mangaImage"
        android:layout_width="381dp"
        android:layout_height="650dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</LinearLayout>
  

Комментарии:

1. Что именно вы видите? Можете ли вы поделиться изображением?

2. @tomerpacific Абсолютно ничего, просто пустой recyclerview

3. Для ViewHolder класса вы должны использовать другой макет с видом элемента. Вы можете найти дополнительную информацию здесь developer.android.com/guide/topics/ui/layout/recyclerview

4. @Stanislav Bondar Я не понимаю, как мне это сделать

Ответ №1:

Вам нужен отдельный элемент для изображения. например, создайте файл в layouts item_manga.xml с

 <ImageView
    android:id="@ id/mangaImage"
    android:layout_width="381dp"
    android:layout_height="650dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
  

И ваш viewholder должен выглядеть как-то так

  @Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
{
    View itemView = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.item_manga, viewGroup, false);
    return new ViewHolder(itemView);
}
  

У меня нет опыта работы с Glide, поэтому я ничего не могу сказать об этом. Но вы можете попробовать это с локальным изображением, чтобы посмотреть, работает ли оно

 holder.image.setImageBitmap(bitmap)
  

Комментарии:

1. Спасибо @Felix Из-за тебя я понял, что мне нужно использовать a Constrained layout , а не a LinearLayout .