본문 바로가기
개발/안드로이드

[안드로이드]recycleview item의 특정 텍스트 색상 변경

by 핸디(Handy) 2019. 10. 15.

개선 요청 사항 : 검색창의 결과를 좀 더 직관적으로 보고싶다. 매칭되는 검색어에 해당하는 텍스트의 색상을 바꿔달라.

 

<기존>

보시다시피 recycleview의 item holder에서는 그냥 item의 정보를 가져와 setText로 입력해주는 방식이었습니다.

 @Override
    public void onBindViewHolder(@NonNull RoutelayoutFragment_find_location_Adapter.MyViewHolder holder, int position) {
        try{
        if(mDataset.get(position)!=null) {
            fragment_home_second_pathlist_Item item = mDataset.get(position);

            holder.place_name.setText(item.getPlace_name());
            holder.category_name.setText(item.getCategory_name());
            holder.address_name.setText(item.getRoad_address_name());

            Log.d("testtesttest", item.getPlace_name() + " " + item.getX() + " " + item.getY());
        }
        }catch (IndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }

기존 검색창

 

<개선>

개선결과, SpannableString을 이용하여 content(기존 text)를 가져오기 word라는 타켓텍스트를 설정하여 setSpan으로 색상을 바꾸게 되었습니다.

추가적으로 setSpan에는 색상변경 뿐만 아니라 글자 크기, 위치등 다양한 변경이 가능하니 확인해보시기 바랍니다.

    @Override
    public void onBindViewHolder(@NonNull RoutelayoutFragment_find_location_Adapter.MyViewHolder holder, int position) {
        try{
        if(mDataset.get(position)!=null) {
            fragment_home_second_pathlist_Item item = mDataset.get(position);

            // 기존 item의 string을 가져옴
            String content = item.getPlace_name().toString();
            SpannableString spannableString = new SpannableString(content);

            // 타켓이 되는 word를 설정(색을 바꾸려는 text)
            String word = find_location_edittext_text;
            int start = content.indexOf(word);
            int end = start + word.length();

            // 타켓 word의 색상 변경
            spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#438bff")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            //삽입
            holder.place_name.setText(spannableString);
            holder.category_name.setText(item.getCategory_name());
            holder.address_name.setText(item.getRoad_address_name());

            Log.d("testtesttest", item.getPlace_name() + " " + item.getX() + " " + item.getY());
        }
        }catch (IndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }

 

개선된 검색창

 

<끝>

댓글