Reputation: 181
I'm learning scala. Trying to filter data in recyclerview. I used the similar code in java and it works. But when I tried in scala its not filtering as expected. The result showing in filtering is wrong. Like there are 2 Rakesh
in the list. But when I type "ra", it only shows "Pranab Pal". Please let me know what I'm doing wrong in Filtering
. Thanks.
class NewActivity extends AppCompatActivity {
private var getBtn: Button = _
var list: List[Model] = List()
var recyclerView: RecyclerView = _
var adapter: MyAdapter = _
var listBuffer = new ListBuffer[Model]()
var searchEt: EditText = _
override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new)
searchEt = findViewById(R.id.searchEt).asInstanceOf[EditText]
getBtn = findViewById(R.id.getBtn).asInstanceOf[Button]
getBtn.setOnClickListener(new View.OnClickListener {
override def onClick(view: View): Unit = {
listBuffer += Model("Somnath", "Pal")
listBuffer += Model("Bhavesh", "Mandal")
listBuffer += Model("Rakesh", "Choudhary")
listBuffer += Model("Rakesh", "Tiwary")
listBuffer += Model("Pranab", "Pal")
listBuffer += Model("Mrinal", "Chatterjee")
listBuffer += Model("Abhinav", "Sinha")
listBuffer += Model("Abhinav", "Kumar")
listBuffer += Model("Amit", "Tiwary")
/*val model1 = Model("Somnath", "Pal")
val model2 = Model("Bhavesh", "Mandal")
val model3 = Model("Rakesh", "Choudhary")
listBuffer += (model1, model2, model3)*/
list = listBuffer.toList
recyclerView = findViewById(R.id.recycler).asInstanceOf[RecyclerView]
recyclerView.setLayoutManager(new LinearLayoutManager(NewActivity.this, LinearLayoutManager.VERTICAL, false))
recyclerView.setHasFixedSize(true)
adapter = new MyAdapter(NewActivity.this, list)
recyclerView.setAdapter(adapter)
}
})
searchEt.addTextChangedListener(new TextWatcher() {
override def beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int): Unit = if(3>0){
}
override def onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int): Unit = NewActivity.this.adapter.getFilter().filter(charSequence)
override def afterTextChanged(editable: Editable): Unit = {
if(3>0){
}
}
})
}
}
class MyAdapter(context: Context, resource: List[Model]) extends RecyclerView.Adapter[RcvMsgViewHolder] with Filterable {
var filterList: List[Model] = resource
var arrayList: List[Model] = resource
override def onCreateViewHolder(parent: ViewGroup, viewType: Int): RcvMsgViewHolder = {
val inflater: LayoutInflater = context.asInstanceOf[Activity].getLayoutInflater
val mconvertView = inflater.inflate(R.layout.row, parent, false)
new RcvMsgViewHolder(mconvertView, viewType, context)
}
override def getItemCount: Int = {
if (filterList != null) {
filterList.size
}
else {
0
}
}
override def onBindViewHolder(holder: RcvMsgViewHolder, position: Int): Unit = {
val item = filterList(position)
holder.fnameTxt.setText(item.fName)
holder.lnameTxt.setText(item.lName)
}
override def getFilter: Filter = {
new Filter {override def publishResults(charSequence: CharSequence, filterResults: FilterResults): Unit = {
filterList = filterResults.values.asInstanceOf[List[Model]]
notifyDataSetChanged()
}
override def performFiltering(charSequence: CharSequence): FilterResults = {
val charString: String = charSequence.toString.toLowerCase()
var nlistBuffer = new ListBuffer[Model]()
if (charString.isEmpty) filterList = arrayList
else {
nlistBuffer.clear()
for (item <- arrayList) {
if (item.fName.contains(charString) || item.lName.contains(charString)){
nlistBuffer += new Model(item.fName, item.lName)
}
}
filterList = nlistBuffer.toList
}
val filterResults: Filter.FilterResults = new Filter.FilterResults
filterResults.values = filterList
filterResults.count = filterList.size
filterResults
}
}
}
}
class RcvMsgViewHolder(mconvertView: View, viewType: Int, context: Context) extends RecyclerView.ViewHolder(mconvertView) {
var position = viewType
var item: Model = null
val fnameTxt: TextView = mconvertView.findViewById(R.id.fnameTxt).asInstanceOf[TextView]
val lnameTxt: TextView = mconvertView.findViewById(R.id.lnameTxt).asInstanceOf[TextView]
}
case class Model(fName: String, lName: String)
Upvotes: 0
Views: 547
Reputation: 116
you are lower casing the charSequence
when converting it to charString
, however, while performing filtering you are using contains
which does a case sensitive search.
You can process arrayList
in MyAdapter
class to contain lower case'd models, if that makes sense programmatically, or convert to lower case and perform a contains
search such as
for (item <- arrayList) {
if (item.fName.toLowerCase.contains(charString) || item.lName.toLowerCase.contains(charString)){
nlistBuffer += new Model(item.fName, item.lName)
}
}
Upvotes: 1