如何解决我正在尝试使用edittext在recyclerView中添加过滤器,但面临问题
这是主要活动代码(已编辑)
在这里,我尝试添加 searchView 并过滤该 recyclerView,但我面临与 getfilter() 相关的问题。在 MainActivity 类 > searchView.setOnQuery... > mAdapter.getFilter().filter(query) 中。 可能是我遗漏了什么,或者我做错了什么。
class MainActivity : AppCompatActivity() {
var recyclerView: RecyclerView? = null
var mAdapter: RecyclerView.Adapter<*>? = null
var layoutManager: RecyclerView.LayoutManager? = null
var personUtilsList: MutableList<PersonUtils>? = null
var personUtils: PersonUtils? = null
var rq: RequestQueue? = null
var request_url = "https://sheetdb.io/api/v1/wgkdzpdiyflckl9"
private lateinit var adp: CustomRecyclerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
rq = Volley.newRequestQueue(this)
recyclerView = findViewById<View>(R.id.recycleViewContainer) as RecyclerView
recyclerView!!.setHasFixedSize(true)
layoutManager = LinearLayoutManager(this)
recyclerView!!.setHasFixedSize(true)
recyclerView!!.layoutManager = layoutManager
personUtilsList = java.util.ArrayList()
sendRequest()
search.addTextChangedListener {
//search is a editText
object : TextWatcher{
override fun beforeTextChanged(s: CharSequence?,start: Int,count: Int,after: Int) {
}
override fun onTextChanged(s: CharSequence?,before: Int,count: Int) {
}
override fun afterTextChanged(s: Editable?) {
filterList(s.toString())
} } }
}
sendRequest{...}
private fun filterList(toString: String) {
var temp: MutableList<PersonUtils> = ArrayList()
for (data in personUtilsList!!){
if(data.personFirstName!!.contains(toString.capitalize())
){
temp.add(data)
}
}
adp.updateList(temp)
}
}
它是适配器类(已编辑)
public class CustomRecyclerAdapter(private val context: Context,personUtils: List<PersonUtils>)
: RecyclerView.Adapter<CustomRecyclerAdapter.ViewHolder>(),Filterable {
private var personUtils: MutableList<PersonUtils>
private var utilsFilterList: MutableList<PersonUtils>
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.single_list_item,parent,false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
holder.itemView.tag = personUtils[position]
val pu = personUtils[position]
holder.pName.text = pu.personFirstName.toString() + " .58-" + pu.personLastName.toString()
holder.pJobProfile.text = pu.jobProfile
holder.Department.text = pu.Department
holder.email.text = pu.Email
holder.phN.text = pu.PhoneNo
Glide.with(this.context).load(pu.imgUrl.toString()).into(holder.img!!)
}
fun updateList(temp : MutableList<PersonUtils>){
personUtils = temp
notifyDataSetChanged()
}
override fun getItemCount(): Int {
return personUtils.size
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var pName: TextView
var pJobProfile: TextView
var Department: TextView
var email: TextView
var phN: TextView
var img: ImageView? = null
init {
pName = itemView.findViewById<View>(R.id.pNametxt) as TextView
pJobProfile = itemView.findViewById<View>(R.id.pJobProfiletxt) as TextView
Department = itemView.findViewById<View>(R.id.department_Branch) as TextView
email = itemView.findViewById<View>(R.id.user_email) as TextView
phN = itemView.findViewById<View>(R.id.user_phNo) as TextView
img = itemView.findViewById<View>(R.id.userImg) as ImageView
itemView.setOnClickListener { view ->
val cpu = view.tag as PersonUtils
Toast.makeText(view.context,"Copied to clipboard",Toast.LENGTH_SHORT).show()
val Clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val myClip = ClipData.newPlainText(cpu.personFirstName,cpu.personFirstName)
Clipboard.setPrimaryClip(myClip)
}
}
}
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
var charString = constraint.toString()
var filteredList : MutableList<PersonUtils> = mutableListOf()
if (charString.isEmpty()) {
filteredList.addAll(utilsFilterList)
} else {
val filteredList: MutableList<PersonUtils> = ArrayList()
for (row in personUtils) {
if (row.personFirstName!!.toLowerCase().contains(charString.toLowerCase())
|| row.Department!!.contains(constraint.toString())) {
filteredList.add(row)
}
}
utilsFilterList = filteredList
}
val filterResults = FilterResults()
filterResults.values = utilsFilterList
return filterResults
}
override fun publishResults(constraint: CharSequence?,results: FilterResults?) {
if(results !=null) {
personUtils.clear()
personUtils.addAll(results.values as Collection<PersonUtils>)
notifyDataSetChanged()
}
}
}
}
init {
this.personUtils = personUtils as MutableList<PersonUtils>
utilsFilterList = personUtils.toMutableList()
}
}
解决方法
您正在使用 utilsFilterList
过滤 Recyclerview 项目,但您从 personUtils.size
返回 getItemCount()
因此,即使您在 notifyDataSetChanged()
中调用 publishResults()
,您的主列表 personUtils
仍然保持不变,因为您将所有过滤结果存储在 utilsFilterList
编辑:
我通常使用以下方法
标记为**内的编辑
public class CustomRecyclerAdapter(private val context: Context,personUtils: List) : RecyclerView.Adapter<CustomRecyclerAdapter.ViewHolder>(),Filterable {
private var personUtils: MutableList<PersonUtils>
*private var utilsFilterList : MutableList<PersonUtils> *
override fun getFilter(): Filter {
return object : Filter()
{
override fun performFiltering(constraint: CharSequence?): FilterResults {
var charString = constraint.toString()
*val filteredList: MutableList<PersonUtils> = mutableListOf()*
if(charString.isEmpty()){
*filteredList.addAll(utilsFilterList)*
}
else{
for(row in utilsFilterList){
if (row.personFirstName!!.toLowerCase().contains(charString.toLowerCase())
|| row.Department!!.contains(constraint.toString())) {
filteredList.add(row)
}
}
}
val filterResults = FilterResults()
filterResults.values = filteredList
return filterResults
}
override fun publishResults(constraint: CharSequence?,results: FilterResults?) {
*if(results !=null) {
personUtils.clear()
personUtils.addAll(results.values as Collection<PersonUtils>)*
notifyDataSetChanged()
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.single_list_item,parent,false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
holder.itemView.tag = personUtils[position]
val pu = personUtils[position]
holder.pName.text = pu.personFirstName.toString() + " .58-" +
pu.personLastName.toString()
holder.pJobProfile.text = pu.jobProfile
holder.Department.text = pu.Department
holder.email.text = pu.Email
holder.phN.text = pu.PhoneNo
Glide.with(this.context).load(pu.imgUrl.toString()).into(holder.img!!)
}
override fun getItemCount(): Int {
return personUtils.size
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var pName: TextView
var pJobProfile: TextView
var Department: TextView
var email: TextView
var phN: TextView
var img : ImageView? = null
init {
pName = itemView.findViewById<View>(R.id.pNametxt) as TextView
pJobProfile = itemView.findViewById<View>(R.id.pJobProfiletxt) as TextView
Department = itemView.findViewById<View>(R.id.department_Branch) as TextView
email = itemView.findViewById<View>(R.id.user_email) as TextView
phN = itemView.findViewById<View>(R.id.user_phNo) as TextView
img = itemView.findViewById<View>(R.id.userImg) as ImageView
itemView.setOnClickListener { view ->
val cpu = view.tag as PersonUtils
Toast.makeText(view.context,"Copied to clipboard",Toast.LENGTH_SHORT).show()
val Clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val myClip = ClipData.newPlainText(cpu.personFirstName,cpu.personFirstName)
Clipboard.setPrimaryClip(myClip)
}
}
}
init {
this.personUtils = personUtils as MutableList<PersonUtils>
*utilsFilterList = personUtils.toMutableList()*
}
}