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