2011-08-20 14 views
34

ListViewに(連絡先リストのような)アルファベットの文字を付けるためのチュートリアルがたくさんありますが、ListActivityクラスを使用しているようです私はちょうどListView(特別なアクティビティなし)とデータのArrayListを使用しています。誰も私の独自のListViewの連絡先リストでそのアルファベットとスクロール機能を実装する方法を知っていますか?Android側のアルファベットを表示する方法ListView

編集再び

は、私はついにそれを動作させるだろうと思ったthis tutorialを、続いて、私はまだ近く強制的に取得しています。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     sectionList.toArray(sections); 

    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

LogCatには、java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetionと記載されています。私はそれが私が働いているものでは全く別のアプリを参照していないので、それは本当に奇妙だと思った。私は他のアプリをアンインストールしようとしたが、まだ強制終了していたが、LogCatが更新しなかったために何が表示されたのか分かりました。

最終編集ここ

は、作業コードです。 9ヶ月遅れのようなものを投稿して申し訳ありません。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     for (int i = sections.length - 1; i >= 0; i--) { 
      if (position >= alphaIndexer.get(sections[ i ])) { 
       return i; 
      } 
     } 
     return 0; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

編集:getSectionForPositionは、スクロールしながらスクロールを適切な場所に表示したい場合に重要です。 1(または0)だけを返すと、最初の(または2番目の)セクションでスクロールしていることがわかります。その結果、スクロールバーの位置が間違っています(ほとんど画面外になります)。追加されたコードは適切なセクションを返し、スクロール側は実際の場所を知ることができます。

+0

ListActivityを使用しない理由はありますか?あなたが話すチュートリアルにリンクすることはできますか? –

+0

部分文字列(0、0)? –

+0

単語の最初の文字を取得する –

答えて

21

の例があります。alphaIndexerをインスタンス化するのを忘れました。今は完璧に動作します。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 
+0

最終的な作業コードを追加できますか? – akd

+0

@Pat:完成したら、最後の作業デモも欲しい。ありがとう。 –

+0

@akdurmus非常に遅れて申し訳ありません。 –

3

私が正しく理解している場合は、fastScrollEnabled=trueと設定すると、右の小さな親指のスクロールバーが表示されます。連絡先のような浮動文字を追加したい場合、List9.javaのAPIDemosプロジェクト(http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/view/List9.java.shtml)の

+0

私は彼らが実際にA、B、C、 iPhoneの連絡先リストのUIに似ています。カスタムスクロールバーウィジェットタイプのものです。 –

+0

スクロール中にセクションと表示されるダイアログがあります。また、ListViewでfastScrollEnabledがtrueに設定されています。 –

関連する問題