在recyclerview中过滤数据

时间:2017-10-03 05:50:37

标签: android scala android-recyclerview

我正在学习scala。试图在recyclerview中过滤数据。我在java中使用了类似的代码并且它可以工作。但是当我尝试使用scala时,它没有按预期过滤。过滤显示的结果是错误的。就像列表中有2 Rakesh一样。但是当我键入“ra”时,它只显示“Pranab Pal”。请告诉我Filtering中我做错了什么。感谢。

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)

1 个答案:

答案 0 :(得分:1)

在将charSequence转换为charString时,您的下限是contains,但是,在执行过滤时,您使用arrayList进行区分大小写的搜索。

您可以在MyAdapter类中处理contains以包含小写模型,如果这是有意义的,或转换为小写并执行for (item <- arrayList) { if (item.fName.toLowerCase.contains(charString) || item.lName.toLowerCase.contains(charString)){ nlistBuffer += new Model(item.fName, item.lName) } } 搜索,例如

selenium