#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 расположен вертикально по центру