안 드 로 이 드 는 병 음 을 통 해 중국어 기능 구현 코드 를 검색 합 니 다.
본론 으로 돌아 가 오늘 제 가 기록 하고 자 하 는 것 은 병 음 검색 기능 입 니 다.16 년 동안 이 기능 을 했 던 것 으로 기억 합 니 다.지금 은 이미 많은 세부 사항 을 잊 어 버 렸 으 니 이번 에는 잘 써 라!
STEP 1:준비
<?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 류 의 두 가지 방법 입 니 다.어댑터 가 다 썼 습 니 다.어떻게 사용 하 는 지 보 겠 습 니 다.
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()); 여기에 우리 가 쓴 필 터 를 호출 했다.
이로써 우리 의 검색 필터 기능 은 이미 실현 되 었 다.
실행 효과 보기:
이어서 중국어 병 음 을 말 해 보 겠 습 니 다.
우선 데이터 원본 형식 을 수정 해 야 합 니 다.
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
안 드 로 이 드 가 병 음 을 통 해 중국 어 를 검색 하 는 기능 실현 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 가 중국 어 를 검색 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.