2017-10-03 3 views
0

J'apprends la scala. Essayer de filtrer les données dans recyclerview. J'ai utilisé le code similaire dans Java et ça marche. Mais quand j'ai essayé dans Scala son filtrage pas comme prévu. Le résultat affiché dans le filtrage est incorrect. Comme il y a 2 Rakesh dans la liste. Mais quand je tape "ra", il ne montre que "Pranab Pal". S'il vous plaît laissez-moi savoir ce que je fais mal dans Filtering. Merci.Filtrer les données dans recyclerview

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)

Répondre

1

vous êtes le boîtier inférieur charSequence lors de la conversion à charString, cependant, tout en effectuant un filtrage utilisez contains qui effectue une recherche sensible.

Vous pouvez traiter arrayList dans MyAdapter classe pour contenir des modèles case'd inférieurs, si cela est logique par programmation, ou de convertir en minuscules et effectuer une recherche contains tels que

for (item <- arrayList) { 
    if (item.fName.toLowerCase.contains(charString) || item.lName.toLowerCase.contains(charString)){ 
     nlistBuffer += new Model(item.fName, item.lName) 
    } 
} 
+0

Merci beaucoup. Cela fonctionne parfaitement. – Sammy