2011-12-14 11 views
0

カスタムアダプターを使用してリストビューを作成したい場合は、タイプが名前フィールド(String)を持つArrayAdapterを継承します。私はアイテムAlphabitcly(これは問題ではない)を並べ替えるし、アルファベットセクションを配置したい。例えばAndroidアプリケーションでArrayAdapterを使用しているアルファベット順のアルファベット順のリストビュー

: アルファ任意 ... C 子... Iインク

また - 結果は、ユーザがGetMoreResultを押すようにするとき、ページングを使用して、Webサービスから取得されますボタン、リストはそれに応じて更新する必要があります - notifyDataSetChangedは動作しますか?

+0

お役に立ちましたか?関連するhttp://stackoverflow.com/a/37101450/3496570 – Nepster

答えて

3

リストビューのコードをアルファベットでダウンロードできます。あなたが必要なもの

http://www.anddev.org/code-snippets-for-android-f33/alphabetical-listview-in-android-t56983.html

+0

このサンプルはアルファベット順に項目を並べ替えません。ソースを確認してください。 –

+0

Thansk a lot。試してみる。面白そうに見える - 私は自分でソートを行います。これは問題ではありません – Yoav

+0

listItemObjectコンストラクタでは、このコードをソートする際にupperとlowerを区別せずにソートします。文字c = name.charAt(0); \t \t文字c1 = Character.toUpperCase(c); \t \t name = name.replaceFirst(c.toString()、c1.toString()); this.name = name; –

1

notifyDataSetChangedはリストを更新します。はい。

更新時に、リストアダプターが構築時に渡されたものへの参照を保持するため、リストオブジェクトを再割り当てしないようにしてください。 notifyDataSetChangedを呼び出す前に、それをクリアして補充してください。

+0

OK。しかし、どのようにしてセクションを持つリストを作成できますか?それは私の主な問題です – Yoav

2

区切り文字です。セパレーターを追加する方法を理解するにはthis guideを使用してください。

あなたのAdapterには、アルファベットのどこにあなたがいるかを示す変数が必要です。あなたは、あなたが通常の項目を追加しているか、区切り文字を追加しているかどうかを判断する必要があります-method getView

private Char currentChar; 

。ような何か:覚えて

if(currentItem.getCharAt(0) != currentChar) 
    //add a seperator. 
else 
    //add an item. 

一つはListViewが突然配列よりも多くの項目が含まれていますので、あなたは、アイテムのインデックスを混ぜるかもしれないということです。これを修正する1つの方法は、配列にダミーアイテム(nullオブジェクトだけでもよい)を追加することです。

8

私は同じことを試みていました。私はKasperが述べたcurrentCharロジックを使ってやってみました。 listView()の呼び出しは必ずしも期待通りのものではないので、うまく動作しないようです。私のソリューションは次のようなものです:

XMLでは、可視性を持つTextViewを追加します。これはセパレータタグになります。

<TextView 
    style="?android:attr/listSeparatorTextViewStyle" 
    android:id="@+id/separator" 
    android:layout_width="fill_parent" 
    android:visibility="gone" 
    android:layout_height="wrap_content" 
    android:textColor="@android:color/white" /> 

:私は、Android標準の区切り形式を使用します。もちろん、自分で作ることもできます。この方法は、以下の利点があり

if (separatorAtIndex[position]) { 
      holder.sectionHeader.setText(""+name.charAt(0)); 
      holder.sectionHeader.setVisibility(View.VISIBLE); 
     } else { 
      holder.sectionHeader.setVisibility(View.GONE); 
} 

は、このような何かを行う)(最後にあなたがgetViewメソッドでこの

/** 
* Method takes the alphabetically sorted ArrayList as argument 
*/   
private void assignSeparatorPositions(ArrayList<Items> items) { 
     separatorAtIndex = new boolean[items.size()]; 
     char currentChar = 0; 

     for (int i=0; i< items.size(); i++) { 
      if (itemss.get(i).getName().charAt(0) != currentChar) { 
       separatorAtIndex[i] = true; 
      } else { 
       separatorAtIndex[i] = false; 
      } 
      currentChar = items.get(i).getName().charAt(0); 
     } 

} 

のような方法何かであなたにアダプタクラスをブール配列を追加します別のヘッダービューを追加した後にアイテムの新しい位置を追跡する必要はありません。

0

CursorAdapterとサアドファルークの答えを機能させるために、私はgetViewメソッド(の以下のハックのようなものを使用):

String thisTitle = getStringValue(cursor, TITLE_NAME); 
char thisSection = thisTitle.toUpperCase().charAt(0); 
holder.sectionHeader.setText(thisSection); 

holder.separator.setVisibility(View.GONE); 

// Check if the previous entry was a different alphabetic character 
if (cursor.moveToPrevious()) 
{ 
    String prevTitle = getStringValue(cursor, TITLE_NAME); 
    char prevSection = prevTitle.toUpperCase().charAt(0); 
    if (prevSection != prevTitle) 
    { 
     holder.separator.setVisibility(View.VISIBLE); 
    } 
    cursor.moveToNext(); 
} 

注意がこのようなセグメント化されたリストを表示するためのより良い方法がありますが、これが機能すること必要なときに素早くハックします。

関連する問題