Мои изображения не отображаются с помощью RecyclerView?

У меня небольшая проблема, я пытаюсь отобразить список элементов, но он не работает, каждый элемент содержит изображение, поэтому вот моя активность:

public class TestRecyclerImagesActivity extends AppCompatActivity {
    @BindView(R.id.listImages)
    RecyclerView listImages;


    RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.images_list);

        ButterKnife.bind(this);

        ImageModel img = new ImageModel("test1");
        List list = new ArrayList<ImageModel>();

        list.add(img);
        list.add(img);

        list.add(img);
        list.add(img);


        adapter = new ImageListAdapter(this, list);

        this.listImages.setAdapter(adapter);

        this.listImages.setLayoutManager(new LinearLayoutManager(this));

    }
}

А вот и мой адаптер:

public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.ImageViewHolder>{

    List<ImageModel> images;
    Context context;

    public ImageListAdapter(Context context, List<ImageModel> contracts){
        this.context = context;
        this.images = contracts;

    }

    public void updateImages(List<ImageModel> newImages){
        images.clear();
        images.addAll(newImages);
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ImageListAdapter.ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image, parent, false); // ContratBinding >> as your list item layout named "contrat"
        return new ImageListAdapter.ImageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageListAdapter.ImageViewHolder holder, int position) {
        holder.bind(images.get(position));
    }

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

    public class ImageViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.img)
        ImageView image;

        public ImageViewHolder(View iview){
            super(iview);
            ButterKnife.bind(this, iview);
        }

        void bind(ImageModel imageModel){
            image.setImageResource(R.drawable.newimage);
        }

    }


}

Это мой макет listImages:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/listImages"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:layout_editor_absoluteX="1dp"
            tools:layout_editor_absoluteY="1dp" />
</LinearLayout>

Это мой предмет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp" >
    <ImageView
        android:id="@+id/img"
        android:src="@drawable/newimage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Так почему он ничего не отображает? Я чувствую, что все сделал правильно.

Для Image src сейчас он не динамический, я использую изображение непосредственно в своем рисовании, я установил исходный код с кодом, не работал, установил его в XML, не работал, установил его в обоих, и лол не сделал Работа.

Любая помощь приветствуется.


person TaouBen    schedule 14.04.2020    source источник


Ответы (2)


В представлении изображения у вас есть обернутый контент, попробуйте его в match_constrain, и вам нужно onCreateViewHolder вернуть свое представление и сказать, что в представлении, например

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image, parent, false);
ImageView object = view.findViewById<ImageView>(R.id.img);

теперь у вас есть представление изображения, теперь выберите источник изображения и передайте его источнику объекта.

person Pedro Capela    schedule 14.04.2020
comment
Я использую аннотацию ButterKnife, чтобы получить свой элемент - person TaouBen; 14.04.2020
comment
никогда не работал с аннотацией Butterknife, но в коде они говорят, что вам нужно вернуть представление одновременно - person Pedro Capela; 14.04.2020
comment
открытый класс MyAdapter extends BaseAdapter { @Override public View getView (int position, View view, ViewGroup parent) { ViewHolderholder; if (view!= null) {holder = (ViewHolder) view.getTag(); } else { view = inflater.inflate(R.layout.whatever, parent, false); держатель = новый ViewHolder (представление); view.setTag (держатель); }holder.name.setText(Джон Доу); // и т.д... возвращаем представление; } - person Pedro Capela; 14.04.2020
comment
Я уже новый ImageViewHolder возвращаю, думаю вы просто не видели - person TaouBen; 14.04.2020
comment
Модель изображения получает uri, и вы отправляете простую строку, возможно, что это было неправильно, попробуйте сделать журнал об этом и пришлите мне, чтобы я мог проверить. - person Pedro Capela; 14.04.2020
comment
ImageModel присутствует как параметр, но еще не используется. мое изображение представляет собой imageView image.setImageResource(R.drawable.newimage); - person TaouBen; 14.04.2020
comment
Я попытаюсь сказать, что у вас есть RecyclerView в содержимом обертки и обертке содержимого, список внутри которого обновляется, но у переработчика нет, когда представление создается, все еще в обертке от bigining, который равен 0 x 0, поэтому сделайте соответствие ограниченным, надеюсь, что это работает - person Pedro Capela; 14.04.2020

Во-первых Попробуйте установить layoutmanager перед адаптером

this.listImages.setLayoutManager(new LinearLayoutManager(this)); 
this.listImages.setAdapter(adapter); 

Второе

Сделайте ширину recyclerview match_parent и ширину родительского LinearLayout также match_parent

Третье

Укажите требуемую ориентацию в вашем менеджере компоновки, например вертикальную/горизонтальную.

Четвертое

Инициализируйте ur arraylist в самом адаптере, а при обновлении очистите и добавьте новый список

открытый класс ImageListAdapter расширяет RecyclerView.Adapter{

List<ImageModel> images = new ArrayList();
Context context;

public ImageListAdapter(Context context, List<ImageModel> contracts){
    this.context = context;
    this.images.clear();
    this.addAll(contracts);
}

Пятая вещь

Попробуйте указать фиксированную высоту для просмотра изображений. В настоящее время это wrap_content.

person akashzincle    schedule 14.04.2020
comment
Сделайте ширину recyclerview match_parent и ширину родительского LinearLayout также match_parent - person akashzincle; 14.04.2020
comment
Ммм, нет, не сработало, я не думаю, что это проблема стиля. - person TaouBen; 14.04.2020
comment
@TaouBen хахаха.. Я сдаюсь!! - person akashzincle; 14.04.2020
comment
Нет проблем, я тоже сдался Ха-ха, это странно, потому что я чувствую, что все сделал правильно - person TaouBen; 14.04.2020
comment
Ржунимагу! Только последний указатель. Вы можете проверить вид, используя параметр «Показать привязку макета», который находится в «Настройках» в «Параметры разработчика». Когда вы включите его, вы сможете увидеть контуры всех представлений, возможно, это может дать вам некоторую подсказку в этом вопросе. - person akashzincle; 14.04.2020
comment
Можете ли вы указать, где именно, я новичок в этой среде - person TaouBen; 14.04.2020
comment
Итак, в основном есть настройка «Для разработчиков» в Android-устройстве, которая по умолчанию скрыта. Если вы еще не открыли ее, и есть какие-то ярлыки, чтобы сделать ее видимой, скорее всего, это будет перейти в -> Настройки-> О телефоне. -› номер сборки телефона -> нажмите несколько раз-> будет открыта опция «Разработчик» -> в настройках разработчика будет много настроек, связанных с разработчиком, одним из них будет «Показать границы макета». Весь этот процесс может отличаться в зависимости от производителя телефона и т. д. Вы можете найти его в Google в зависимости от производителя вашего устройства. - person akashzincle; 14.04.2020