跳到主要內容

Android 漢語拼音排序

大家好,我是奶綠茶
研究了好一陣子的 Android
也上架了一個 WP7Contact 的 App,
來分享一下如果使用漢語拼音來排序聯絡人
android 官方有分享一個 HanziToPinyin.java
使用這個類別,就可以得到漢語拼音
接著透過 String 的 compareToIgnoreCase
就可以依字母排序

1. 得到聯絡人
先過濾一下,只要出現有電話的聯絡人即可,同時只要得到 _id 和 display_name 的欄位就好
String select = "((" + ContactsContract.Data.DISPLAY_NAME
    + " NOTNULL) AND (" + ContactsContract.Data.HAS_PHONE_NUMBER
    + "=1) AND (" + ContactsContract.Data.DISPLAY_NAME
    + " != '' ))";

  final String[] PROJECTION = new String[]{
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME
  };
  
  Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
    PROJECTION, select, null, null);

2. 得到漢語拼音, 這個 function 是從 android 裡另一個類別取出的
public static String getSortKey(String pName) {
        ArrayList tokens = HanziToPinyin.getInstance().get(pName);
        if (tokens != null && tokens.size() > 0) {
            StringBuilder sb = new StringBuilder();
            for (Token token : tokens) {          
                if (Token.PINYIN == token.type) {
                    if (sb.length() > 0) {
                        sb.append(' ');
                    }
                    sb.append(token.target);
                    sb.append(' ');
                    sb.append(token.source);
                } else {
                    if (sb.length() > 0) {
                        sb.append(' ');
                    }
                    sb.append(token.source);
                }
            }
            return sb.toString();
        }
        return pName;
 }
排序的方法
private final class PinyinComparator implements Comparator {
  public int compare(ContactInfo o1, ContactInfo o2) {  
   return o1.sort_key.compareToIgnoreCase(o2.sort_key);
  } 
 }

ListView 使用的 Adapter
public class ContactAdapter extends BaseAdapter {
  private LayoutInflater mInflater;
  private ArrayList itemList;

  public ContactAdapter(Context context, ArrayList itemList) {
   mInflater = LayoutInflater.from(context);
   this.itemList = itemList;
  }
  public int getCount() {   return itemList.size();  }

  public Object getItem(int position) { return itemList.get(position);  }

  public long getItemId(int position) { return position;  }

  public View getView(int position, View convertView, ViewGroup parent) {
   View v = convertView;
   ViewHolder holder = null;
   // 快取 ListView 的技巧
   // 先斷判是否已經產生過 View 
   // 把該子View 記錄下來,這樣就不用每次都重新 findViewById   
   if (v == null) {
    v = mInflater.inflate(R.layout.main_list_row, null);
    holder = new ViewHolder();
    holder.nameText = (TextView) v.findViewById(R.id.name_txt);
    holder.idText = (TextView) v.findViewById(R.id.description_txt);
    v.setTag(holder);
   } else {
    holder = (ViewHolder) v.getTag();
   }
   holder.nameText.setText(itemList.get(position).contact_name);
   holder.idText.setText(itemList.get(position).sort_key);
   return v;
  }


 }
 private class ViewHolder {
  TextView nameText;
  TextView idText;
 }

 private class ContactInfo {  
  String contact_name;  
  String sort_key;
  long _id;
 }
轉載請註明出處

SourceCodeDownload

留言

這個網誌中的熱門文章

webpack2 入門實戰 1

大家好,我是奶綠茶
前端戰場不再只是寫寫 js / css , 各種框架、前處理工具百花齊放
身為前端工程師,不只要把程式寫完,還要寫好
老師說:選對好工具,事情就完成一半
如果你還在一隻 JS 打完全部程式,一隻 css 寫所有的 style
每次存檔還在手動 reload 網頁, 圖片壓 K 壓到不要不要的
透過奶綠伯的系列教學,讓你了解 webpack2 帶來的優勢
學會 webpack 可能不會加薪,但至少可以準時下班(誤)
1. 安裝 nodejs
請參考 gulp 安裝編

2. 安裝 global webpack , 筆者使用的是 2.2.1 版本
npm i webpack@2.2.1 -g
3. 在專案的根目錄放一隻 webpack.config.js
entry:你的主 js 進入點
output.filename:webpack 打包後的檔名
output.path:webpack 打包後的路徑
var path = require('path'); module.exports = { entry: './src/app.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') } };
4. require , module.exports
現在前端都 module 化
可以每個獨立的功能都寫成單一的 js module
除了好管理,也方便讓團隊使用
寫一隻 module_exports_util.js
每隻經過 webpack 打包的 js , 都會是獨立的檔案
所以變數都是私有的, 外部成員都無法得到
在這個 module 裡,我們想開放二個函式
add , getName
所以在最後的 module.exports 指定
筆記加入 jsdoc , 為了方便在開發時,能夠有型別的提示

var name = "milkmidi"; /** * @param {number} num1 * @param {number} num2 * @return {number} */ function ad…

webpack2 入門實戰 3 scss,html,file-loader

大家好,我是奶綠茶
上一篇介紹了 webpack 的核心功能 loader
這篇再來補強各種常用的 loader
css-loader:解悉 css 檔
extract-loader:這個有點難翻,下面會介紹
file-loader:存成實體的檔案, 如圖片
html-loader:解悉 html 檔
sass-loader:解悉 scss 檔
url-loader:解悉圖片路徑
webpack.config.js
module.exports = { resolveLoader: { // 所有用到的 loader, -loader 可以不用打 moduleExtensions: [ "-loader" ], }, resolve: { // 在 require 檔案, 如果不想寫完整的路徑 // 可以加入這些目錄, 讓 webpack 自動尋找對的檔案 // 請注意我們加入了 src/img 路徑,後面會再介紹到 modules: [ path.resolve( 'src/html' ), path.resolve( 'src/img' ), path.resolve( 'src/css' ), path.resolve( 'src/js' ), path.resolve( "node_modules"), ], // 在 require 時可以不用打副檔名 extensions: [ ".js", ".scss" ] }, } 再來就是 loader 的介紹
scss
在這要做多組合的應用
先將 .scss 透過 scss-loader 轉換, 並產生 sourceMap 檔
再過 css-loader
最後再過 style-loader
{ test: /\.scss$/, // 多個 loader 組合, 可寫成一行,或…

gulp 前端自動化 - spritesheet

大家好,我是奶綠茶
今天來介紹如何使用 gulp 來自動化將圖片拼成 spritesheet
奶綠我使用的套件是 gulp.spritesmith
https://www.npmjs.com/package/gulp.spritesmith
可以使用 handlebars 格式,拼出自己想要的 css 格式
{{#sprites}} .{{name}} { background-position: {{px.offset_x}} {{px.offset_y}}; width: {{px.width}}; height: {{px.height}}; background-image: url({{{escaped_image}}}); } {{/sprites}} gulp 的設定
gulp.task('sprite',()=>{ console.log('sprite'); const spriteData = gulp.src('src/sprite_src/*') .pipe(spritesmith({ imgName: '../img/sprite.png', cssName: '_sprite.css', padding: 4, imgOpts: { quality: 100 }, cssTemplate: 'src/css/handlebars/basic.handlebars', })); const imgStream = spriteData.img .pipe(buffer()) .pipe(gulp.dest('dist/img/')); const cssStream = spriteData.css .pipe(gulp.dest('src/css')); return merge(imgStream, cssStream); });…