Проблема привязки представления Android при включении макета с тегом «include» с прямым дочерним элементом в нем

Я пытаюсь включить макет, который содержит единственный recyclerView.

home_recycler_view.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingStart="@dimen/_8sdp"
android:paddingEnd="@dimen/_8sdp" />

И включите это в основной макет, как показано ниже.

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/slider_recyclerView"
        layout="@layout/home_recycler_view" />

    <include
        android:id="@+id/boards_recyclerview"
        layout="@layout/home_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/_12sdp" />

    <include
        android:id="@+id/news_recyclerview"
        layout="@layout/home_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/_12sdp" />

    <include
        android:id="@+id/video_recyclerview"
        layout="@layout/home_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/_12sdp"
        android:layout_marginBottom="@dimen/_2sdp" />

</LinearLayout>

In this case, it gives me an error like,

java.lang.NullPointerException: Missing required view with ID: homeRecyclerView

Сгенерированный класс home_recycler_view.xml

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.backendme.arduinolearn.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;

public final class HomeRecyclerViewBinding implements ViewBinding {
  @NonNull
  private final RecyclerView rootView;

  @NonNull
  public final RecyclerView homeRecyclerView;

  private HomeRecyclerViewBinding(@NonNull RecyclerView rootView,
      @NonNull RecyclerView homeRecyclerView) {
    this.rootView = rootView;
    this.homeRecyclerView = homeRecyclerView;
  }

  @Override
  @NonNull
  public RecyclerView getRoot() {
    return rootView;
  }

  @NonNull
  public static HomeRecyclerViewBinding inflate(@NonNull LayoutInflater inflater) {
    return inflate(inflater, null, false);
  }

  @NonNull
  public static HomeRecyclerViewBinding inflate(@NonNull LayoutInflater inflater,
      @Nullable ViewGroup parent, boolean attachToParent) {
    View root = inflater.inflate(R.layout.home_recycler_view, parent, false);
    if (attachToParent) {
      parent.addView(root);
    }
    return bind(root);
  }

  @NonNull
  public static HomeRecyclerViewBinding bind(@NonNull View rootView) {
    // The body of this method is generated in a way you would not otherwise write.
    // This is done to optimize the compiled bytecode for size and performance.
    String missingId;
    missingId: {
      RecyclerView homeRecyclerView = rootView.findViewById(R.id.home_recycler_view);
      if (homeRecyclerView == null) {
        missingId = "homeRecyclerView";
        break missingId;
      }
      return new HomeRecyclerViewBinding((RecyclerView) rootView, homeRecyclerView);
    }
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  }
}

если я оборачиваю recyclerView любым родительским макетом, таким как макет фрейма, он работает нормально, но я не хочу оборачивать свой recyclerView в любой другой вид.

пожалуйста, предоставьте мне решение для этого, как я могу включить макет с прямым дочерним элементом в этом случае (RecyclerView) без какой-либо корневой или родительской группы просмотра в Viewbinding?


person MEET Prajapati    schedule 09.04.2020    source источник
comment
home_recycler — ваш идентификатор. Но исключение говорит о homeRecyclerView. Почему? знак равно   -  person Oleg Skidan    schedule 09.04.2020
comment
@OlegSkidan это идентификатор, сгенерированный классом привязки представления. Я добавил этот класс к моему вопросу. вы можете найти этот класс там.   -  person MEET Prajapati    schedule 10.04.2020


Ответы (1)


Когда вы даете идентификатор, это означает, что вы устанавливаете идентификатор для корневого представления макета, который вы включаете. В этом случае вы устанавливаете идентификатор для своего представления ресайклера, и поэтому он не может найти представление ресайклера с его исходным идентификатором. Что вам нужно сделать, это

  1. используйте <merge> в общем макете.
  2. Оберните RecyclerView в <merge>.
  3. Не сообщайте <include> никакого удостоверения личности.
  4. Вызовите метод bind() сгенерированного класса макета слияния и передайте корневой вид макета, в который вы включили свой макет.
  5. Доступ к вашему представлению из объекта привязки слияния

Например, у вас есть home_recycler_view.xml, поэтому у вас будет сгенерировано HomeRecyclerView.class, и именно так вы получите доступ к представлению из этого макета.

class TestActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityTestBinding.inflate(layoutInflater)
        val homeRecyclerBinding= HomeRecyclerView.bind(binding.root)
        setContentView(binding.root)
        homeRecyclerBinding.homeRecyclerView.adapter= SomeAdapter()
    }
}
person Somesh Kumar    schedule 11.04.2020
comment
что, если я хочу использовать этот макет несколько раз в одном и том же XML? слияние работает без разных идентификаторов? - person MEET Prajapati; 15.04.2020
comment
@MEETPrajapati Я понятия не имею об этом. Я думаю, что <merge> не предназначено для такого использования... но я могу ошибаться. Вы должны сначала попробовать, а затем, если что-то не работает, задать отдельный вопрос об этом. Если текущий ответ решает вашу проблему, вы должны отметить его как ответ. - person Somesh Kumar; 17.04.2020