Как я могу показать массив с помощью RecyclerView?

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

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

    private final int listSize;
    private String[] list;

    public MyAdapter(int listSize, String[] list) {
        this.listSize = listSize;
        this.list = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.rv_item,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.bind(position);
    }

    @Override
    public int getItemCount() {
        return listSize;
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        TextView item;
        Button button;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            item = itemView.findViewById(R.id.item_view);
            button = itemView.findViewById(R.id.button_item_view);
        }
        void bind(int index) {
            button.setText(String.valueOf(index));
            item.setText(list[index]);
        }
    }
}
  

В этом классе адаптера я хочу показать массив строк. Единственная проблема заключается в том, что первый элемент (с нулевым индексом) отсутствует на экране, несмотря на то, что элемент существует за пределами экрана (извините за такую большую картинку).

введите описание изображения здесь

Кнопки должны быть пронумерованы нулем, поэтому массив должен быть напечатан, начиная с нулевого элемента. Как я могу решить эту проблему?

UPD: Вот макет:

rv_item

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@ id/item_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|start"
        android:text="TextView"
        android:textSize="40sp" />

    <Button
        android:id="@ id/button_item_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|end"
        android:layout_marginEnd="48dp"
        android:padding="10dp"
        android:text="INFO" />
</FrameLayout>
  

activity_top, в котором используется виджет RecyclerView

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".TopLevelActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/listOfGoods"
        android:layout_width="409dp"
        android:layout_height="729dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/rv_item" />
</androidx.constraintlayout.widget.ConstraintLayout>
  

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

1. Похоже, это проблема с макетом, пожалуйста, проверьте свой макет, если вы не можете найти проблему, пожалуйста, опубликуйте макет

Ответ №1:

Не указывайте фиксированную высоту RecyclerView

Правильный способ:

 <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/listOfGoods"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/rv_items" />
  

P.S: Я взял ваш пример и запустил приложение на api 29, все работает отлично, приветствую!
Также не делайте этого listSize final , компилятор выдаст ошибку, поскольку вы не инициализируете

Ответ №2:

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

 @Override
public int getItemCount() {
    return listSize;
}
  

Для этого:

 @Override
public int getItemCount() {
    return list.length;
}
  

Еще одна вещь: попробуйте отладить этот объект this.list = list; и проверьте, содержит ли массив нулевой элемент индекса. Если массив содержит этот элемент, вероятно, в нем должно быть что-то о макете, как упоминалось @Rui Alves.

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

1. Высота Recyclerview вызывает проблему, потому что recyclerview расположен вертикально по центру