[英]Search View throwing exception (Null Object Reference)
我有一個使用 FragmentPagerAdapter 的片段並使用兩個回收器視圖加載 2 個其他片段。 我正在嘗試根據在 searchView 中鍵入的文本過濾回收站視圖的項目。 我沒有使用單獨的搜索活動,而是嘗試對兩個回收器視圖使用過濾器。
我有以下用於搜索功能的代碼(我正在為兩個片段實現相同的邏輯,即 ListOneFragment 和 ListTwoFragment,它們具有各自的 recycleView)。
分段:
class ListOneFragment : Fragment() {
lateinit var adapter: ListOneRecyclerViewAdapter
lateinit var listonerv: RecyclerView
viewModel.getListOne().observe(viewLifecycleOwner,Observer {
recyclerView.apply {
layoutManager = LinearLayoutManager(context,RecyclerView.VERTICAL, false)
adapter = ListOneRecyclerViewAdapter(it, mViewModel)
}
adapter = recyclerView.adapter as ListOneRecyclerViewAdapter
})
listonerv = findViewById(R.id.recyclerView)
listone_search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
//------------------------The exception is being thrown for the line above------------------------
override fun onQueryTextSubmit(query: String?): Boolean {
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
adapter.filter.filter(newText)
return false
}
})
回收器視圖適配器:
class ListOneRecyclerViewAdapter(
private val firstList : ArrayList<ListOne>,
private val viewModel: ListViewModel
): RecyclerView.Adapter<ListOneViewHolder>(), Filterable {
var filterList = ArrayList<ListOne>()
init{
filterList = firstList //so that when the search bar is empty, all items are populated
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
ListOneViewHolder(viewModel,
LayoutInflater.from(parent.context).inflate(R.layout.item_one, parent, false))
override fun getItemCount() = filterList.size
override fun onBindViewHolder(holder: ListOneViewHolder, position: Int) {
holder.bind(filterList[position])
}
override fun getFilter(): Filter {
Log.d("Test", "Inside getFilter")
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val charSearch = constraint.toString()
if (charSearch.isEmpty()) {
Log.d("Test","char is empty")
filterList = firstList
} else {
Log.d("Test","something typed")
val resultList = ArrayList<ListOne>()
for (row in firstList) {
if (row.name.toLowerCase(Locale.ROOT).contains(charSearch.toLowerCase(Locale.ROOT))) {
resultList.add(row)
}
}
filterList = resultList
Log.d("Test",filterList.toString())
}
val filterResults = FilterResults()
filterResults.values = filterList
Log.d("Filter",filterResults.values.toString())
return filterResults
}
@Suppress("UNCHECKED_CAST")
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
filterList = results?.values as ArrayList<ListOne>
Log.d("Publish",filterList.toString())
notifyDataSetChanged()
}
}
}
XML :(具有視圖 Pager 和 App Bar 中的搜索視圖的常見片段)
<androidx.coordinatorlayout.widget.CoordinatorLayout 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/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".screens.first.ListOneFragment">
<include
layout="@layout/layout_background_image" />
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:navigationIcon="?homeAsUpIndicator"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/white"
app:tabIndicatorHeight="@dimen/_2sdp"
app:tabSelectedTextColor="@color/white" />
<androidx.appcompat.widget.SearchView
android:id="@+id/listone_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textCursorDrawable="@null"
app:queryHint="@string/Search"
android:elevation="@dimen/_8sdp"
app:iconifiedByDefault="false"
app:queryBackground="@null"
app:layout_constraintTop_toBottomOf="@+id/appbar"
app:layout_constraintStart_toStartOf="parent"/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
但我得到以下異常:
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.widget.SearchView.setOnQueryTextListener(androidx.appcompat.widget.SearchView$OnQueryTextListener)' on a null object reference
我正在嘗試使用 searchView 而不引入其他僅用於搜索的活動。 這對於具有一個回收器視圖的單個片段非常有效。 這是一個示例( https://johncodeos.com/how-to-add-search-in-recyclerview-using-kotlin/ )
我會盡力回答,希望能幫到你。
我不清楚,但我猜顯示的片段代碼是您在查看器中顯示的片段代碼之一,對吧? 如果我在這里是正確的,那么您的 searchview 不在您的ListOneFragment中,這就是為什么給您一個 null 異常的原因,因為 search_view 不在其布局中。 要解決這個問題,其中一種方法是將 appbar/searchview 放在ListOneFragment和ListTwoFragment中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.