汉字转拼音android实现(HanziToPinyin类)

        对Contacts了解就会知道(不了解可以了解下),每个联系人都有一个sort_key字段,如果查询中没有设置sortOrder,默认就会以 sort_key字段为排序依据。名字的检索其实也是根据sort_key来做的(比如拨号盘的模糊匹配:数字转成字母,再到拼音,最后得到汉字)。sort_key是根据名字生成的:如果联系人名字中包含字母,sort_key和name保持一致;如果名字是汉字,生成的sort_key,拼音-汉字-拼音-汉字。。。其中拼音全大写,中间以空格分割,如:”张三“-----sort_key:"ZHANG 张 SAN 三"。

       当名字发生变化Sort_key是在packages/providers/ContactsProvider/src/com/android /providers/contacts/ContactsProvider2.java中生成的。具体调用如下:
if (displayNameStyle == FullNameStyle.CHINESE ||
                    displayNameStyle == FullNameStyle.CJK) {
                sortKeyPrimary = sortKeyAlternative =
                        ContactLocaleUtils.getIntance().getSortKey(
                                displayNamePrimary, displayNameStyle)
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
好的,这是一个比较具体的问题,我来给你提供一下代码实现: ``` import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SectionIndexer; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.github.promeg.pinyinhelper.Pinyin; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); // 获取应用列表 List<ApplicationInfo> appList = getInstalledApps(this); // 按照应用名首字母排序 Collections.sort(appList, new Comparator<ApplicationInfo>() { @Override public int compare(ApplicationInfo o1, ApplicationInfo o2) { String pinyin1 = Pinyin.toPinyin(getAppName(o1), ""); String pinyin2 = Pinyin.toPinyin(getAppName(o2), ""); return pinyin1.compareToIgnoreCase(pinyin2); } }); // 设置ListView的适配器 AppListAdapter adapter = new AppListAdapter(this, appList); mListView.setAdapter(adapter); mListView.setFastScrollEnabled(true); } /** * 获取已安装应用列表 * * @param context 上下文对象 * @return 应用列表 */ private List<ApplicationInfo> getInstalledApps(Context context) { List<ApplicationInfo> appList = new ArrayList<>(); PackageManager packageManager = context.getPackageManager(); List<ApplicationInfo> allApps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo app : allApps) { if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { appList.add(app); } } return appList; } /** * 获取应用名称 * * @param app 应用信息对象 * @return 应用名称 */ private String getAppName(ApplicationInfo app) { PackageManager pm = getPackageManager(); return pm.getApplicationLabel(app).toString(); } /** * AppListAdapter */ private static class AppListAdapter extends ArrayAdapter<ApplicationInfo> implements SectionIndexer { private List<ApplicationInfo> mAppList; private List<String> mSections; private List<Integer> mSectionPositions; public AppListAdapter(Context context, List<ApplicationInfo> appList) { super(context, R.layout.item_app, appList); mAppList = appList; generateSections(); } @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_app, parent, false); holder = new ViewHolder(); holder.tvName = convertView.findViewById(R.id.tv_name); holder.tvPinyin = convertView.findViewById(R.id.tv_pinyin); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ApplicationInfo app = mAppList.get(position); String name = app.loadLabel(getContext().getPackageManager()).toString(); holder.tvName.setText(name); holder.tvPinyin.setText(Pinyin.toPinyin(name, "").substring(0, 1)); return convertView; } @Override public Object[] getSections() { return mSections.toArray(); } @Override public int getPositionForSection(int sectionIndex) { return mSectionPositions.get(sectionIndex); } @Override public int getSectionForPosition(int position) { for (int i = mSectionPositions.size() - 1; i >= 0; i--) { if (position >= mSectionPositions.get(i)) { return i; } } return 0; } /** * 生成索引相关的数据 */ private void generateSections() { mSections = new ArrayList<>(); mSectionPositions = new ArrayList<>(); String lastSectionHeader = ""; for (int i = 0; i < mAppList.size(); i++) { String name = mAppList.get(i).loadLabel(getContext().getPackageManager()).toString(); String sectionHeader = Pinyin.toPinyin(name, "").substring(0, 1).toUpperCase(); if (!sectionHeader.equals(lastSectionHeader)) { mSections.add(sectionHeader); mSectionPositions.add(i); } lastSectionHeader = sectionHeader; } } /** * ViewHolder */ private static class ViewHolder { TextView tvName; TextView tvPinyin; } } } ``` 这段代码可以满足你的需求,实现了按照应用名称的拼音首字母排序,并且支持索引条快速定位。需要注意的是,需要引入第三方库 `pinyinhelper` 来实现中文拼音的功能,你可以在 `build.gradle` 文件中添加以下依赖: ``` implementation 'com.github.promeg:pinyinhelper:2.8.0' ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值