2017-10-03 2 views
0

Ich lerne scala. Der Versuch, Daten in der Recycleransicht zu filtern. Ich habe den ähnlichen Code in Java verwendet und es funktioniert. Aber als ich es in scala versuchte, filterte es nicht wie erwartet. Das Ergebnis der Filterung ist falsch. Wie gibt es 2 Rakesh in der Liste. Aber wenn ich "ra" tippe, wird nur "Pranab Pal" angezeigt. Bitte lassen Sie mich wissen, was ich falsch mache in Filtering. Vielen Dank.Filterdaten in 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)

Antwort

1

Sie sind niedriger die charSequence Gehäuse, wenn es um die Umwandlung charString jedoch während der Durchführung Filtern Sie contains verwenden, die eine Suche Groß- und Kleinschreibung der Fall ist.

Sie können arrayList in MyAdapter Klasse verarbeiten untere case'd Modelle enthalten, wenn der Sinn macht programmatisch oder Bekehrtfall und führen eine contains Suche wie

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

Vielen Dank zu senken. Es funktioniert perfekt. – Sammy

Verwandte Themen