2011年8月17日水曜日

ArrayAdapterのsort()を使ってみる

複数の文字列を画面に表示する場合、それらをアルファべット順とかで並べ替えたい(ソートしたい)ですね。

多くのプログラマはjavaベースのCollections.sortを行うのかもしれません。
私が作ったのはArrayAdapterのsortメソッドを使っているので、androidに特化したものです。

compareメソッド内で文字列の比較を行います。一覧内で先頭や末尾に表示したい文字列を設定できます。例えば、ディレクトリを意味する文字列の末尾に/があれば、それを一括りにもできますので、ディレクトリ群を最初に、ファイル群を後に表示することもできます。

androidのファイルシステムでは、ファイルやディレクトリはソートされた状態ではありませんので、このソートを使って表示する必要があります。

AASortActivity.java

public class AASortActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ListView lv;
        lv = new ListView(this);
        setContentView(lv);
        
        ArrayAdapter<String> aa;
        aa = new ArrayAdapter<String>(this, R.layout.list_item, MyStringData);
        aa.sort(new MyComparator());
        lv.setAdapter(aa);
    }
    
    public class MyComparator implements Comparator<String>{
        @Override
        public int compare(String s1, String s2){
            if(s1.equals("First")==true) return -1;
            if(s2.equals("First")==true) return 1;
            
            if(s1.length()==0) return 1;
            if(s2.length()==0) return -1;
            
            if(s1.charAt(s1.length()-1)=='/'
            && s2.charAt(s2.length()-1)!='/') return -1;
            if(s1.charAt(s1.length()-1)!='/'
            && s2.charAt(s2.length()-1)=='/') return 1;
            
            return s1.compareTo(s2);
        }
    }
    
    static final String[] MyStringData = new String[] {
        "qqq8", "qqq3", "qqq4", "qqq/", "qqqr",
        "www5", "www7", "www/", "www3", "wwwe",
        "First", "..", "",
        "eee2", "eee0", "eee/", "eee6", "eee3"
    };
}

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
</TextView>

この技術を使ってファイル選択ダイアログボックスの作成をしてみました。

0 件のコメント:

コメントを投稿