Отсутствует требуемый вид с идентификатором. В чем моя вина?

#android #android-studio #kotlin #android-recyclerview

Вопрос:

Я новичок в android studio этом деле . При использовании binding in recyclerview adapter я получил следующую ошибку : Отсутствует требуемый вид с идентификатором

 E/AndroidRuntime: FATAL EXCEPTION: main  Process: com.example.co_investorux_ui, PID: 18057  java.lang.NullPointerException: Missing required view with ID: com.example.co_investorux_ui:id/app_name  at com.example.co_investorux_ui.databinding.ActivityMainBinding.bind(ActivityMainBinding.java:151)  at com.example.co_investorux_ui.RecyclerViewAdapter.onCreateViewHolder(MainActivity.kt:205)  at com.example.co_investorux_ui.RecyclerViewAdapter.onCreateViewHolder(MainActivity.kt:183)  at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7295)  at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6416)  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)  at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)  at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)  at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)  at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)  at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)  at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012)  at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at com.sothree.slidinguppanel.SlidingUpPanelLayout.onLayout(SlidingUpPanelLayout.java:863)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:536)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)  at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)  at com.android.internal.policy.DecorView.onLayout(DecorView.java:779)  at android.view.View.layout(View.java:21912)  at android.view.ViewGroup.layout(ViewGroup.java:6260)  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3080)  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2590)  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721)  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7598)  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)  at android.view.Choreographer.doCallbacks(Choreographer.java:790)  at android.view.Choreographer.doFrame(Choreographer.java:725)  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)  at android.os.Handler.handleCallback(Handler.java:883)  at android.os.Handler.dispatchMessage(Handler.java:100)  at android.os.Looper.loop(Looper.java:214)  at android.app.ActivityThread.main(ActivityThread.java:7356)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)  

Когда я не использовал binding , он работал нормально, без ошибок.

Код без binding

 //recyclerview adapter  class RecyclerViewAdapter(  val itemList: ArrayListlt;CoinListgt;,  val inflater: LayoutInflater  ) : RecyclerView.Adapterlt;RecyclerViewAdapter.ViewHoldergt;(), Filterable {  private var searchList: ArrayListlt;CoinListgt;? = null   inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {  val name: TextView  val count: TextView   init {  name = itemView.findViewById(R.id.coin_name)  count = itemView.findViewById(R.id.coin_count)  }  }   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {  val view = inflater.inflate(R.layout.item_view, parent, false)  return ViewHolder(view)  }   override fun onBindViewHolder(holder: ViewHolder, position: Int) {  holder.name.setText(itemList.get(position).name)  holder.count.setText(itemList.get(position).count)  holder.itemView.setOnClickListener {  }  }   override fun getItemCount(): Int {  return itemList.size  }   }  

Code using binding

 // recyclerview adapter class RecyclerViewAdapter(  val itemList: ArrayListlt;MainActivity.CoinListgt;,  val inflater: LayoutInflater ) : RecyclerView.Adapterlt;RecyclerViewAdapter.ViewHoldergt;(), Filterable {  private var searchList: ArrayListlt;MainActivity.CoinListgt;? = null   class ViewHolder(val binding: ActivityMainBinding) : RecyclerView.ViewHolder(binding.root) {  val name: TextView  val count: TextView   init {  name = itemView.findViewById(R.id.coin_name)  count = itemView.findViewById(R.id.coin_count)  }  }   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {  val view = inflater.inflate(R.layout.item_view, parent, false)  return ViewHolder(ActivityMainBinding.bind(view))  }   override fun onBindViewHolder(holder: ViewHolder, position: Int) {  holder.name.setText(itemList.get(position).name)  holder.count.setText(itemList.get(position).count)  val slidePanel = holder.binding.mainFrame   holder.itemView.setOnClickListener {  val state = slidePanel.panelState  // Open slidePanel when it closed.  if (state == SlidingUpPanelLayout.PanelState.COLLAPSED) {  slidePanel.panelState = SlidingUpPanelLayout.PanelState.ANCHORED  }  // Close slidePanel when it open  else if (state == SlidingUpPanelLayout.PanelState.EXPANDED) {  slidePanel.panelState = SlidingUpPanelLayout.PanelState.COLLAPSED  }  }  }   override fun getItemCount(): Int {  return itemList.size  }  }  

xml код

 lt;com.sothree.slidinguppanel.SlidingUpPanelLayout 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:id="@ id/mainFrame"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:gravity="bottom"  app:umanoDragView="@id/slide_layout"  app:umanoPanelHeight="16dp"  tools:context=".MainActivity"gt;   lt;androidx.constraintlayout.widget.ConstraintLayout  android:id="@ id/first_layout"  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;androidx.recyclerview.widget.RecyclerView  android:id="@ id/recyclerview"  android:layout_width="match_parent"  android:layout_height="430dp"  android:paddingBottom="15dp"  app:layout_constraintBottom_toBottomOf="parent"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toBottomOf="@id/search_view" /gt;   lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;   lt;androidx.fragment.app.FragmentContainerView  android:id="@ id/slide_layout"  android:layout_width="match_parent"  android:layout_height="430dp"  android:background="#ffffff"gt;lt;/androidx.fragment.app.FragmentContainerViewgt;   lt;/com.sothree.slidinguppanel.SlidingUpPanelLayoutgt;  

Я реализую функцию, которая sildinguppanellayout вызывается при itemview recyclerview нажатии кнопки, но я не могу устранить ошибку.

Не могли бы вы, пожалуйста, сообщить мне, что я сделал не так?

Ответ №1:

ActivityMainBinding будут привязываться только представления, созданные из activity_main.xml (обратите внимание на название). Для привязки представлений , созданных из item_view.xml , вам необходимо использовать ItemViewBinding.bind(view) .

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

1. Спасибо за ваш любезный ответ. Но я уже использовал ItemViewBinding . Чтобы позвонить slidinguppanellayout , мне нужно получить состояние mainFrame , в котором и mainFrame создается activity_main.xml . Есть ли какое-либо решение в этом случае?

2. val view = inflater.inflate(R.layout.item_view, parent, false) return ViewHolder(ActivityMainBinding.bind(view)) эта часть

3. Убедитесь, что вы используете классы привязки, соответствующие макету, используемому для создания представления. Кроме того, вы используете идентификатор элемента вместе с привязкой, это неправильное использование привязки.

4. Спасибо вам за ответ. Благодаря вам я понял, что моя проблема была не только из-за binding этого . Независимо от того , использую binding или findviewbyid , мне нужно сослаться на два xmls(activity_main, item_view) в recyclerview adapter . activity_main необходимо, чтобы получить состояние mainFrame . Как вы можете видеть из code without binding , я только ссылаюсь item_view . Есть ли какой-либо способ ссылаться activity_main и item_view в то же время входить recyclerview adapter ? Если есть способ, я думаю, что смогу решить эту проблему. Я недостаточно хорош, но спасибо тебе за помощь.

5. Я не знаком с этой библиотекой, предоставляет ли библиотека какой-либо обратный вызов при изменении состояния? Или вам каждый раз приходится проверять вручную? В любом случае, более эффективным подходом было бы предоставить панель слайдов в качестве параметра для адаптера, а затем проверить состояние с помощью этого. Привязка и повторная привязка представлений каждый раз приведет к хаосу.