안 드 로 이 드 는 병 음 을 통 해 중국어 기능 구현 코드 를 검색 합 니 다.

몇 년 동안 블 로 그 를 쓰 지 않 았 습 니 다.많은 지식 을 기억 하지 않 으 면 정말 잊 어 버 릴 것 입 니 다.앞으로 블 로 그 를 쓰 는 습관 을 유지 하 세 요.견지 하 는 것 이 반드시 성공 하 는 것 은 아니 지만,포기 하 는 것 은 분명 편안 할 것 이다!농담 입 니 다(\#^.^\#)
본론 으로 돌아 가 오늘 제 가 기록 하고 자 하 는 것 은 병 음 검색 기능 입 니 다.16 년 동안 이 기능 을 했 던 것 으로 기억 합 니 다.지금 은 이미 많은 세부 사항 을 잊 어 버 렸 으 니 이번 에는 잘 써 라!
STEP 1:준비
  • 제3자 가방-중국어 병 음,pinyin4j-2.5.0.jar,홈 페이지http://pinyin4j.sourceforge.net/
  • Filterable.java필터 인터페이스
  • STEP 2:기능 분석 및 실현
  • 뚜렷 하 다.이것 은 두 가지 기능 이다.하 나 는 중국어 병 음 이 고 하 나 는 검색 필터
  • 이다.
  • 다음 에 우 리 는 먼저 주요 기능 을 실현 하고 여과
  • 을 조회 합 니 다.
  • 레이아웃 파일 만 들 기 activitymain.xml,다음 과 같이 실현:
  • 
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".MainActivity"
      android:padding="16dp">
     
      <EditText
        android:id="@+id/etSearchName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="     "
        android:padding="5dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
     
      <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        app:layout_constraintTop_toBottomOf="@+id/etSearchName"
        />
     
    </androidx.constraintlayout.widget.ConstraintLayout>
    검색 상자 와 목록 컨트롤 하나만
    다음 목록 어댑터 만 들 기  Search Adapter.java,필터 클래스 Filterable 구현
    
    public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.MyViewHolder> implements Filterable {
     
      private Context context;
      private List<String> list;
      //       
      private List<String> originalList;
     
      private OnItemListener onItemListener;
      void setOnItemListener(OnItemListener onItemListener){
        this.onItemListener = onItemListener;
      }
     
      private SearchFilter filter;
     
      SearchAdapter(Context context,List<String> list){
        this.context =context;
        this.list = list;
        originalList = list;
      }
     
      @NonNull
      @Override
      public SearchAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_rv_search,parent,false);
        return new MyViewHolder(view);
      }
     
      @Override
      public void onBindViewHolder(@NonNull SearchAdapter.MyViewHolder holder, final int position) {
        holder.tvName.setText(list.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            if (onItemListener!=null){
              onItemListener.onItem(list.get(position));
            }
          }
        });
      }
     
      @Override
      public int getItemCount() {
        return list==null?0:list.size();
      }
     
      @Override
      public Filter getFilter() {
        if (filter==null){
          filter = new SearchFilter();
        }
        return filter;
      }
     
      class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView tvName;
        MyViewHolder(@NonNull View itemView) {
          super(itemView);
          tvName = itemView.findViewById(R.id.tvName);
        }
      }
     
      interface OnItemListener{
        void onItem(String name);
      }
     
     
      class SearchFilter extends Filter{
     
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
          //         constraint
     
          //         
          FilterResults filterResults = new FilterResults();
     
          if (constraint==null || constraint.length()==0){
            filterResults.values = originalList;
            filterResults.count = originalList.size();
          }else {
            List<String> fList = new ArrayList<>();
            String cons = constraint.toString().trim().toLowerCase();
            for (String s : originalList) {
              //       
              if (s.startsWith(cons)){
                fList.add(s);
              }
            }
            filterResults.values = fList;
            filterResults.count = fList.size();
          }
     
          return filterResults;
        }
     
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
          list = (List<String>) results.values;
          notifyDataSetChanged();
        }
      }
    
    }
    이 코드 의 중점 은 Search Filter 류 의 두 가지 방법 입 니 다.
  • performFiltering(CharSequence constraint)  입력 데 이 터 를 수신 하여 이 방법 으로 처리 논 리 를 실현 합 니 다
  • publishResults(CharSequence constraint, FilterResults results)  필터 받 은 결과
  • 주의 점:originalList 이 집합 은 기 존 데 이 터 를 저장 하 는 데 사 용 됩 니 다.list 는 검색 결과 에 따라 달라 지기 때문에 매번 필 터 는 원래 의 데 이 터 를 사용 해 야 합 니 다.
    어댑터 가 다 썼 습 니 다.어떻게 사용 하 는 지 보 겠 습 니 다.
    
     private RecyclerView recyclerView;
      private SearchAdapter adapter;
      private List<String> list;
     
      private EditText etSearchName;
     
      public static final String[] str = new String[]{
          "   ","  ","  "
          ,"   ","   ","   "
          ,"   ","   ","   "
          ,"   ","   ","  "
          ,"   ","   ","  "
          ,"  ","   ","   "
      };
     
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        etSearchName = findViewById(R.id.etSearchName);
        recyclerView = findViewById(R.id.recyclerView);
     
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
     
        list = new ArrayList<>();
        list.addAll(Arrays.asList(str));
     
        adapter = new SearchAdapter(this,list);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemListener(new SearchAdapter.OnItemListener() {
          @Override
          public void onItem(String name) {
            etSearchName.setText(name);
          }
        });
     
        etSearchName.addTextChangedListener(new TextWatcher() {
          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int     
       after) {
     
          }
     
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {
            adapter.getFilter().filter(etSearchName.getText().toString().trim());
          }
     
          @Override
          public void afterTextChanged(Editable s) {
     
          }
        });
     
      }
    RecyclerView 의 일반적인 동작
    여기 서 주의해 야 할 것 은 이 코드 입 니 다.  adapter.getFilter().filter(etSearchName.getText().toString().trim()); 여기에 우리 가 쓴 필 터 를 호출 했다.
    이로써 우리 의 검색 필터 기능 은 이미 실현 되 었 다.
    실행 효과 보기:

    이어서 중국어 병 음 을 말 해 보 겠 습 니 다.
    우선 데이터 원본 형식 을 수정 해 야 합 니 다.
  •  이전 데이터 원본 은 String 집합 이 었 는데 병 음 을 넣 었 으 니 String 만 사용 할 수 없습니다.실체 UserName 을 만 듭 니 다.필드 에 pinyin 과 name 이 있 습 니 다.
  • pinyin4j.jar 가방 을 통 해 중국 어 를 병 음 으로 바 꾼 다음 UserName 집합 에 저장 합 니 다.코드 는 다음 과 같 습 니 다.
  • 
     HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//     
        format.setVCharType(HanyuPinyinVCharType.WITH_V);//“ü”  V
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);//      
        userNameList = new ArrayList<>();
        for (String name : list) {
          StringBuffer stringBuffer = new StringBuffer();
          for (int j=0;j<name.length();j++){
            char c = name.charAt(j);
            String[] cStrHY = new String[0];
            try {
              cStrHY = PinyinHelper.toHanyuPinyinStringArray(c,format);
            } catch (BadHanyuPinyinOutputFormatCombination       
                badHanyuPinyinOutputFormatCombination) {
              badHanyuPinyinOutputFormatCombination.printStackTrace();
            }
            stringBuffer.append(cStrHY[0]);
          }
          UserName userName = new UserName();
          userName.setPinyin(stringBuffer.toString());
          userName.setName(name);
          userNameList.add(userName);
        }
    PinyinHelper 류 는 여러 가지 변환 방법 이 있 습 니 다.저 는 toHanyuPinyinStringArray 를 선택 하여 하나의 문 자 를 병 음 으로 바 꾸 었 습 니 다.
    주의해 야 할 것 은 HanyuPinyin OutputFormat 류 는 서로 다른 병 음 형식 을 출력 할 수 있다 는 것 이다.
    setTone Type 은 음표 의 표시 방식 을 설정 합 니 다.
    HanyuPinyinToneType.WITH_TONE_MARK:병 음 자모 에 음 표를 표시 합 니 다.예 를 들 어"zh ò ng"입 니 다.
    HanyuPinyinToneType.WITH_TONE_NUMBER:병 음 문자열 뒤에 숫자 로 표시 합 니 다.예 를 들 어"zhong 4"
    HanyuPinyinToneType.WITHOUT_TONE:음표 표시 안 함
    setCase Type 병 음 대소 문자 설정:
    HanyuPinyinCaseType.LOWERCASE:되 돌아 오 는 병 음 은 소문 자 입 니 다.
    HanyuPinyin Case Type.UPPERCASE:돌아 오 는 병 음 은 대문자 입 니 다.
    setVCharType 은 병 음 자모"ü"의 표시 방식 을 설정 합 니 다.
    중국어 병 음 중의"ü"는 영어 로 간단하게 표시 할 수 없 기 때문에"ü"의 표시 형식 을 단독으로 정의 해 야 한다.
    HanyuPinyinVCharType.WITH_U_UNICODE:기본 디 스 플레이 방식,출력"u"
    HanyuPinyinVCharType.WITH_V:"v"출력
    HanyuPinyinVCharType.WITH_U_AND_COLON:출력"u:"
    그래서 필터 의 판단 은 고 쳐 야 합 니 다.코드 는 다음 과 같 습 니 다.
    
     List<UserName> fList = new ArrayList<>();
            String cons = constraint.toString().trim().toLowerCase();
            for (UserName userName : originalList) {
              //       
              if (userName.getPinyin().startsWith(cons)){
                fList.add(userName);
              }
            }
            filterResults.values = fList;
            filterResults.count = fList.size();
    실행 효과 보기:

    요약:
    이 병 음 검색 기능 은 아직 개선 되 어야 한다.
    1.병 음 검색 의 정확성,예 를 들 어 왕 중양(wangzhongyang,wangchongyang)은 사실 두 가지 독음 이 있어 야 하지만 저 는 지금 프로젝트 를 한 가지 만 했 습 니 다.
    나중에 시간 이 있 으 면 다시 보충 하 세 요.프로젝트 주소:https://github.com/tongtian00/CustonSearch
    안 드 로 이 드 가 병 음 을 통 해 중국 어 를 검색 하 는 기능 실현 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 가 중국 어 를 검색 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기