简体   繁体   English

EditText 未过滤 Android Kotlin 中的 RecyclerView 列表

[英]EditText is not filtering the list of RecyclerView in Android Kotlin

I am trying to filter the list in RecyclerView by EditText.我正在尝试通过 EditText 过滤 RecyclerView 中的列表。 In Activity, passing the response in the adapter object, which is getting from the ViewModel class.在 Activity 中,在适配器对象中传递响应,该对象是从 ViewModel 类中获取的。 And in the adapter, the filter method is written.并且在适配器中,写了过滤方法。 Overall the Search Filter from EditText is not working.总体而言,来自 EditText 的搜索过滤器不起作用。 Below the code is written I am not sure how can I resolve this problem.下面写的是代码,我不知道如何解决这个问题。

Project having manly an Activity,Adapter, XML file, and the ViewModel class.具有男子气概的 Activity、Adapter、XML 文件和 ViewModel 类的项目。

fragment_availabletender fragment_availabletender

This page is having EditText & RecyclerView.此页面有 EditText 和 RecyclerView。

         <EditText
         android:id="@+id/editMobileNo"
         android:layout_width="match_parent"
         android:layout_height="50dp"
         android:padding="0dp"
         android:background="@drawable/login_edittext"
         android:ems="10"
         android:hint="Search Tender"
         android:gravity="center"
         android:drawableLeft="@drawable/search_3_24"
         android:layout_below="@+id/tendertext"
         android:paddingLeft="50dp"
         >
       </EditText>

       <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/tender_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:color="@color/cardview_light_background"
        android:padding="6dp"
        android:background="@null"
        android:scrollbars="vertical"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/text1"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        />

Model Class This class is having model模型类 这个类有模型

   data class TenderProperty(

    val id: String,
    @Json(name = "img_src") val imgSrcUrl: String,
    val type: String,
    val price: Double
    )

ViewModel Here response is getting ViewModel这里的响应得到

class NotificationViewModel : ViewModel() {


val response: LiveData<List<TenderProperty>>
    get() = _response

private var _responseByArray = ArrayList<TenderProperty>()
val responseByArray: List<TenderProperty>
    get() = _responseByArray

private val _navigateToSelectedProperty = MutableLiveData<TenderProperty>()
val navigateToSelectedProperty: LiveData<TenderProperty>
    get() = _navigateToSelectedProperty

// Create a Coroutine scope using a job to be able to cancel when needed
private var viewModelJob = Job()

private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main )


init {
    getTenderRealEstateProperties()
}

private fun getTenderRealEstateProperties() {

    coroutineScope.launch {
        // Get the Deferred object for our Retrofit request
        var getPropertiesDeferred = TenderApi.retrofitService.getProperties()
        try {
            // this will run on a thread managed by Retrofit
            val listResult = getPropertiesDeferred.await()

            _responseByArray= listResult as ArrayList<TenderProperty>

           Log.d("respbyary",responseByArray.toString())

        } catch (e: Exception) {

            _response.value = ArrayList()
            Log.d("class",responseByArray.toString())
        }
    }
}

This is the Adapter class这是适配器类

class ListTenderAdapter(context: Context, var tender: List<TenderProperty>) : ListAdapter<TenderProperty, ListTenderAdapter.TenderPropertyViewHolder>(DiffCallback),Filterable {

var originalData=tender

var filteredData = ArrayList<TenderProperty>()

//dought22
class TenderPropertyViewHolder(private var binding: TenderListViewBinding) : RecyclerView.ViewHolder(binding.root) {
    fun bind(tenderProperty: TenderProperty) {
        binding.property = tenderProperty
        binding.executePendingBindings()
    }
}

companion object DiffCallback : DiffUtil.ItemCallback<TenderProperty>()
{
    override fun areItemsTheSame(oldItem: TenderProperty, newItem: TenderProperty): Boolean {
        return oldItem === newItem
    }

    override fun areContentsTheSame(oldItem: TenderProperty, newItem: TenderProperty): Boolean {
        return oldItem.id == newItem.id
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TenderPropertyViewHolder {
    return TenderPropertyViewHolder(TenderListViewBinding.inflate(LayoutInflater.from(parent.context)))
}

override fun onBindViewHolder(holder: TenderPropertyViewHolder, position: Int) {
    val tenderProperty = getItem(position)
    holder.bind(tenderProperty)
}

override fun getFilter(): Filter {

    return object : Filter() {

        override fun performFiltering(constraint: CharSequence?): FilterResults {

            var filteredList = ArrayList<TenderProperty>()
            if (constraint.isNullOrBlank()) {
                filteredData.addAll(originalData)
            }
            else {
                for (data in originalData) {
                    if (
                        data.id.toLowerCase().contains(constraint.toString().toLowerCase())||
                        data.price.toString().toLowerCase().contains(constraint.toString().toLowerCase())||
                        data.type.toLowerCase().contains(constraint.toString().toLowerCase()))
                    {
                        filteredList.add(data)
                    } }
            }
            val filterResults = FilterResults()
            filterResults.values = filteredList
            return filterResults
        }
        override fun publishResults(constraint: CharSequence, results: FilterResults) {

            filteredData.clear()
            filteredData.addAll(results.values as ArrayList<TenderProperty>)
            notifyDataSetChanged()

        }
    }}}

This is the Activity这是活动

 class TenderListActivity:AppCompatActivity() {

lateinit var adapter: ListTenderAdapter
lateinit var search:EditText
private lateinit var binding: FragmentAvailabletenderBinding
private val viewModel: NotificationViewModel by lazy {
    ViewModelProviders.of(this).get(NotificationViewModel::class.java)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.fragment_availabletender)

    binding = DataBindingUtil.setContentView<FragmentAvailabletenderBinding>(
        this,
        R.layout.fragment_availabletender
    )

    search = binding.editMobileNo

    val divider = DividerItemDecoration(applicationContext, DividerItemDecoration.VERTICAL)
    binding.tenderList.addItemDecoration(divider)

    setupRecyclerView()
    initViewModel()
    search()
    backButton()
}

private fun setupRecyclerView() {

    binding.tenderList.addItemDecoration(MarginItemDecoration(5))
    adapter = ListTenderAdapter(this, viewModel.responseByArray)
    binding.tenderList.setAdapter(adapter)

}

private fun initViewModel() {
    viewModel.response.observe(this, Observer {
        adapter.submitList(it)
    })

}

private fun backButton()
{
    binding.backbtn.setOnClickListener(View.OnClickListener {

        val backbtn: Intent = Intent(this,MainActivity::class.java)
        startActivity(backbtn)

    })
}

private fun search()
{
       search.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
        }

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
            adapter.getFilter().filter(s.toString())

        }

        override fun afterTextChanged(s: Editable) {

        }
    })
}}

i'm not use the filter in the adapter,but i think may be u can use the list.filter and setThe NewData with the DiffUtil?我没有在适配器中使用过滤器,但我认为您可以使用 list.filter 和 setThe NewData 与 DiffUtil 吗? although it may be not the best solution虽然它可能不是最好的解决方案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM