Android 기록

kotlin -Edittext로 검색바 만들기 -filtering 기능

FireStone 2019. 11. 20. 17:03

*영상을 올리는데 영상이 너무 크게 나온다..해결하는 방법을 모르겠어서 링크로

https://tv.kakao.com/channel/3430716/cliplink/404007940

edittext로 검색기능 하나 구현하겠다고 이것저것 다함.

먼저 searchview로 하지 않은 이유는 우리 어플은 상단바가 없기도 하고 다른 페이지에서는 굳이 검색기능이 필요하지 않기 때문에

그냥 edittext로 만들어서 구현함

사실 돋보기 버튼을 누르면 검색단어로 검색이 되게 하려했는데..그게 잘 안돼서...

그냥 필터링 기능을 사용해 바로바로 뜨는 식으로 구현함

먼저 시도해봤던 것들을 나열하겠다.

먼저 성공한 것 부터!

*참고로 우리 어플은 kotlin+fragment를 사용하기 때문에 java나  activity로 구현하는 사람들은 형식만 잘 바꿔서 써주면 될듯하다

 

1. 필터링 기능을 onTexgChanged에 넣었다. 따로 getFilter함수를 사용하지 않음

class MyboardFrag : Fragment(), AdapterView.OnItemSelectedListener {
 	var list_post= arrayListOf<BoardData>()
    var searchItemlist= arrayListOf<BoardData>()
    var size_list =1
    private lateinit var adapter_s:BoardRecycle_Adapter
    internal var textlength=0
    private lateinit var _recyclerView: RecyclerView
   var boardSearchList= arrayListOf<BoardData>()
   
   ....이쪽에는 서버에서 값을 받아오는 작업들이 있다.
   /*이부분은 서버에서 값을 받아 arraylist에 넣어주는 작업
     모든 게시글은 list_post에 넣고, boardSearchList에는 검색된 것들을 넣어주기 위해 만들어놓은  array다*/
     
    	  var newPostItem=
                        BoardData(
                            userID_post,
                            goalID_int,
                            contents_post,
                            date_post
                        )
                    list_post.add(newPostItem)
                    boardSearchList.add(newPostItem)
                   ........
                  //이부분은 list_post를 어댑터에 붙이고 view에서 보여주는 부분이다.       
       _recyclerView=view.findViewById(R.id.mrecyclerView)
        _recyclerView.layoutManager = LinearLayoutManager(view.context, LinearLayout.VERTICAL, false)


        adapter_s = BoardRecycle_Adapter(list_post)
        _recyclerView.adapter=adapter_s
        
        val search_edt=view.findViewById<EditText>(R.id.search_edt)
        search_edt.addTextChangedListener(object :TextWatcher{
            override fun afterTextChanged(edit: Editable?) {
              }
            override fun beforeTextChanged(charSequence: CharSequence?, start: Int, count: Int, after: Int) {

            }
            override fun onTextChanged(charSequence: CharSequence?, start: Int, before: Int, count: Int) {
                textlength=search_edt.text.length
                boardSearchList.clear()
                var str_sequence=charSequence.toString()
                for(i in list_post.indices){
                    if(list_post[i].goalID.toString().contains(str_sequence)||(list_post[i].postContent.contains(str_sequence)))
                        boardSearchList.add(list_post[i])
                }
                adapter_s= BoardRecycle_Adapter(boardSearchList)
                _recyclerView.adapter=adapter_s
                _recyclerView.layoutManager = LinearLayoutManager(view.context, LinearLayout.VERTICAL, false)
 }
        })

코드 간단 설명

onTexgChanged를 사용하면 edittext에 입력하는 텍스트를 바로바로 받아 올 수 있다.

나는 goalId와 postContent에 있는 것들을 검색하는게 필요했기 때문에 contain을 사용해 edittext의 글을 필터링 해주었다.

edittext글을 받아오는 부분은 search_edt.text.toString()으로  onTextChanged안에서는 이런식으로 써줘도 되고 charSequence로 사용해주어도 된다.

*charSequence는 처음에는 s로 표기가 되기때문에 본인이 바꾸고 싶은대로 이름을 바꿔 사용하면 된다.

contain으로 필터링 한다음 해당 post를 boardSearch_List에 넣어주고 해당 글을 adapter에 붙여야한다. 

그럼 끝

 

2.getFiltering 사용

참고로 원래 자바나 코틀린에서 getFilter가 있는것 같은데 코틀린에서는 이제 지원해주지 않는건지 따로 없는듯하다

그래서 override말고 그냥 내가 함수를 만들어서 해주었다.

fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(charSequence: CharSequence?): FilterResults {
                val charString = charSequence.toString()
                if (charString.isEmpty())
                    boardSearchList = boardList
                else {
                    val filteredList = ArrayList<BoardData>()
                    for (i in boardList) {
                        if((i.goalID.toString().contains(charString))||(i.postContent.contains(charString)))
                            filteredList.add(i)
                    }
                    boardSearchList=filteredList
                }
                val filterResults=FilterResults()
                filterResults.values=boardSearchList
                System.out.println("여기다 이놈아"+filterResults.values.toString())
                return filterResults
            }

            override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults?) {
                boardSearchList= filterResults?.values as ArrayList<BoardData>
                notifyDataSetChanged()
                System.out.println("here")
            }

        }
    }
    interface ItemClickListener{
        fun onItemClicked(item:BoardData)
    }

이렇게 해주면 필터링은 잘된다. System.out.println으로 확인해봄

근데 어댑터랑 연결하면서 뭐가 문제가 있었던 건지 잘 안돼서 결국 이걸로 하는건 실패했지만 getfilter는 문제가 없다...

무슨 블로그 보고 했는데..링크가 사라져서...아마 잘 찾다보면 나올것이다..

그 블로그는 searchview로 구현한거라  ontext부분은 조금 달랐다.

 

*그다음은 recyclerview를  update해주려 했으나..잘 안됨

기록용으로 남김

fun updateRecycleView(search_item:String): ArrayList<BoardData> {
        var search_indexArray= arrayOf<Int>()
        System.out.println("여기다"+search_item)
       // var goalId_str=""
        var content_str=""
        var j=0
        for(i in 0 until size_list){
            // goalId_str= list_post[i].goalID.toString()
            content_str= list_post[i].postContent
            if(content_str.contains(search_item)){
                search_indexArray[j]=i
                j++
            }
        }
        var list_searchPost= arrayListOf<BoardData>()
        for(i in 0 until search_indexArray.size){
            var userID_post=list_post[i].userID
            var goalID_int=list_post[i].goalID
            var contents_post=list_post[i].postContent
            var date_post=list_post[i].date

            var newPostItem=
                BoardData(
                    userID_post,
                    goalID_int,
                    contents_post,
                    date_post
                )
            list_searchPost.add(newPostItem)
        }
        return list_searchPost

    }

'Android 기록' 카테고리의 다른 글

검색기능 관련 - addTextChangeListener with EditText  (0) 2019.11.14