Как добавить функцию поиска для cardview recyclerview в android kotlin? - PullRequest
0 голосов
/ 23 января 2020
SearchAdapter.kt

class SearchAdapter(ctx:Context,private val imageModelArrayList: ArrayList<SearchModel>) :
    RecyclerView.Adapter<SearchAdapter.MyViewHolder>() {

    private  val inflater: LayoutInflater
    private val arraylist: java.util.ArrayList<SearchModel>

    init {
        inflater = LayoutInflater.from(ctx)
        this.arraylist = java.util.ArrayList<SearchModel>()
        this.arraylist.addAll(MainActivity.imageModelArrayList)
    }
    override fun onBindViewHolder(holder: SearchAdapter.MyViewHolder, position: Int) {

        holder.time.setText(imageModelArrayList[position].getOrders())
    }

    override fun getItemCount(): Int {
        return imageModelArrayList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchAdapter.MyViewHolder {
        val view = inflater.inflate(R.layout.view_orderhistory, parent, false)

        return MyViewHolder(view)
    }

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var time: TextView

        init {

            time = itemView.findViewById(R.id.ordernumber) as TextView
        }

    }

    fun filter(charText: String) {
        var charText = charText
        charText = charText.toLowerCase(Locale.getDefault())
        MainActivity.imageModelArrayList.clear()
        if (charText.length == 0) {
            MainActivity.imageModelArrayList.addAll(arraylist)
        } else {
            for (wp in arraylist) {
                if (wp.getOrders().toLowerCase(Locale.getDefault()).contains(charText)) {
                    MainActivity.imageModelArrayList.add(wp)
                }
            }
        }
        notifyDataSetChanged()
    }
}

SearchModel.kt

class SearchModel {
    var order: String? = null
    private val image_drawable: Int = 0

    fun getOrders(): String {
        return order.toString()
    }

    fun setOrders(order: OrderHistory) {
        this.order = order.toString()
    }
}

Я написал код для заполнения списка. Код работает без ошибок, но моя функция поиска не работает.

MainActivity.kt

class MainActivity : AppCompatActivity(),SearchView.OnQueryTextListener {

    private var recyclerView: RecyclerView? = null
    private var adapter: SearchAdapter? = null
    private var editsearch: SearchView? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView=findViewById(R.id.listOfBookings) as? RecyclerView
        imageModelArrayList = populateList()
        Log.d("hjhjh", imageModelArrayList.size.toString() + "")
        adapter = SearchAdapter(this, imageModelArrayList)
        recyclerView?.adapter = adapter
        recyclerView?.layoutManager = LinearLayoutManager(applicationContext, LinearLayoutManager.VERTICAL, false)

        recyclerView?.addOnItemTouchListener(
            RecyclerTouchListener(
                applicationContext,
                  recyclerView!!,
                  object : ClickListener {

                    override fun onClick(view: View, position: Int) {
                        Toast.makeText(this@MainActivity, imageModelArrayList[position].getOrders(), Toast.LENGTH_SHORT)
                            .show()
                    }

                    override fun onLongClick(view: View?, position: Int) {

                    }
                })
        )


        editsearch = findViewById(R.id.searchView) as SearchView
        editsearch?.setOnQueryTextListener(this)


        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    override fun onQueryTextSubmit(query: String): Boolean {

        return false
    }

    override fun onQueryTextChange(newText: String): Boolean {
        adapter!!.filter(newText)
        return false
    }



    private fun populateList(): ArrayList<SearchModel> {

        val list = ArrayList<SearchModel>()
        val xyz=HomeFragment().orderHistoryList

        for (i in 0 until xyz.size-1) {
            //var xyz=HomeFragment().orderHistoryList
            var order=""
            val imageModel = SearchModel()
            imageModel.setOrders(xyz[i])
            list.add(imageModel)
        }

        return list
    }

    interface ClickListener {
        fun onClick(view: View, position: Int)

        fun onLongClick(view: View?, position: Int)
    }

    internal class RecyclerTouchListener(
        context: Context,
        recyclerView: RecyclerView,
        private val clickListener: ClickListener?
    ) : RecyclerView.OnItemTouchListener {

        private val gestureDetector: GestureDetector

        init {
            gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
                override fun onSingleTapUp(e: MotionEvent): Boolean {
                    return true
                }

                override fun onLongPress(e: MotionEvent) {
                    val child = recyclerView.findChildViewUnder(e.x, e.y)
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child))
                    }
                }
            })
        }

        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {

            val child = rv.findChildViewUnder(e.x, e.y)
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildAdapterPosition(child))
            }
            return false
        }

        override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}

        override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {

        }


    }



    companion object {
        lateinit var imageModelArrayList: ArrayList<SearchModel>
    }

}

В HomeFragment у меня есть список (OrderHistoryList), в котором хранятся порядок, статус и дата. ценности. Я храню эти значения списка в другом списке "ImageModelArrayList", для которого я написал функциональность.

HomeFragment.kt

class HomeFragment : Fragment() {


    private lateinit var orderHistoryViewModel: OrderHistoryViewModel
    private lateinit var activityBinding: FragmentHomeBinding
    var orderHistoryList:ArrayList<OrderHistory> = ArrayList()


        override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,

        savedInstanceState: Bundle?
    ): View? {
        return setupBindings(inflater, container, savedInstanceState)

    }

    private fun setupBindings(
        inflater: LayoutInflater,
        container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        //val activityBinding: FragmentHomeBinding = DataBindingUtil.setContentView(this.context as MainActivity, R.layout.fragment_home) as FragmentHomeBinding

        activityBinding = FragmentHomeBinding.inflate(inflater, container, false)

        orderHistoryViewModel = ViewModelProviders.of(this).get(OrderHistoryViewModel::class.java)
        if (savedInstanceState == null) {
            orderHistoryViewModel.init()
        }

        activityBinding.model = orderHistoryViewModel

        setupListUpdate()

        return (activityBinding as ViewDataBinding).root
    }

    fun setupListUpdate(){
        orderHistoryViewModel.init()
    orderHistoryViewModel.loading?.set(View.VISIBLE)
    var orderHistoryDetails : OrderHistoryDetails = OrderHistoryDetails()

    orderHistoryList.add(OrderHistory(order ="#102-AB-3045",status="Intransit",Date="11 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3047",status="Delivered",Date="13 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3048",status="Delivered",Date="12 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3049",status="Delivered",Date="14 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3056",status="Delivered",Date="16 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3089",status="Delivered",Date="15 Dec"))
    orderHistoryList.add(OrderHistory(order ="#102-AB-3090",status="Delivered",Date="17 Dec"))

    orderHistoryDetails.orderHistoryList =orderHistoryList
    orderHistoryDetails.orderList =MutableLiveData()
    orderHistoryDetails.orderList?.value=orderHistoryDetails.orderHistoryList

    orderHistoryDetails.orderList?.observe(this,
        Observer<List<OrderHistory>> { bookings ->
            orderHistoryViewModel.loading.set(View.GONE)
            if (bookings.isEmpty()) {
                orderHistoryViewModel.showEmpty.set(View.VISIBLE)
            } else {
                orderHistoryViewModel.showEmpty.set(View.GONE)
                orderHistoryViewModel.setBookingsInAdapter(bookings)
            }
        })

        orderHistoryViewModel.orderHistoryDetails=orderHistoryDetails
     }

}

1 Ответ

0 голосов
/ 23 января 2020

Вы можете просмотреть эти ссылки в руководстве java, но полезно для вас

https://velmm.com/android-recyclerview-search-filter-example/

https://demonuts.com/recyclerview-search-filter/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...