2011-12-09 7 views
2

カスタムアダプタを使用してListViewをソートするボタンがあります。次のようにボタンのリスナーがある:ListView not OnClickListenerから再ペイント

collectionSort.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     sortOrder = -sortOrder; 
     Log.d("DBGINF", "Sort Order: " + sortOrder); 
     m.sortByTitles(sortOrder); 
     m.notifyDataSetChanged(); 
}); 

ソート順の変更それが必要、と配列内のデータをソートするなど、実際のビューはいえnotifyDataSetChangedによって更新されることはありません。

public void sortByTitles(int dir) { 
    if (dir > 0) { 
     sort(new StringComparator()); 
    } else if (dir < 0) { 
     sort(new ReverseStringComparator()); 
    } 
    Log.d("Data Set: ", this.getItem(0) + ""); 
} 

notifyDataSetChanged()が今までOnClickListener内部のビューを更新しますが、常に適切OnClickListenersの 1外に動作しません。ここでsortByTitles()メソッドです。私は間違って何をしていますか?ここで

EDIT

は、アダプタクラスのコンストラクタです:

CollectionObject[] sample = new CollectionObject[] { c1, c2, c3, c4, c5, c6 }; 
final MainMenuArrayAdapter m = new MainMenuArrayAdapter(this, sample); 

public MainMenuArrayAdapter(Context context, CollectionObject[] objects) { 
    super(context, R.layout.mainmenurow, objects); 
    myContext = context; 
} 

そして、ここでは、それが活動ののonCreate()メソッドで初期化される方法ですここで、c1〜c6はテストのための一時的なCollectionObjectです。

+0

'myCollections'は何ですか?あなたのアダプタのより多くのコードを見る必要があります。 – st0le

+0

アダプタをどのように初期化したかを確認する必要がありますか? – st0le

+0

私は自分の質問をカスタムアダプターのコンストラクターで編集しました。 myCollectionsはCollectionObjectsをすべて保持する配列です – jpalm

答えて

2

あなたはどのようなアダプターを拡張していますか?私は実際にあなたのアダプタの項目のコピーをソートしていると思います。 myCollectionをアダプタに再度設定していますか? Btw ArrayAdapterを拡張する場合は、アダプタ自体に独自のコンパレータを受け入れるソートメソッドがあることに注意してください。

EDIT: 私は、カスタムアダプタと並べ替えを使用して超愚かな例を書いたので、メニューを押して項目を並べ替えることができます。それが助けてくれることを願って! (RES /メニューの下)

public class SortActivity extends ListActivity { 

private StupidAdapter stupidAdapter; 
private List<String> list = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    list.add("Android-a"); 
    list.add("Android-b"); 
    list.add("Android-c"); 
    list.add("BlackBerry-a"); 
    list.add("BlackBerry-b"); 
    list.add("BlackBerry-c"); 
    list.add("Windows-a"); 
    list.add("Windows-b"); 
    list.add("Windows-c"); 

    // keep in mind that from now on whatever changes you do on list is not reflected on the adapter. 
    // the array adapter keeps its own internal data 
    stupidAdapter = new StupidAdapter(this, list); 
    setListAdapter(stupidAdapter); 

} 

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    new MenuInflater(this.getApplication()).inflate(R.menu.main_menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    final int id = item.getItemId(); 
    if (id == R.id.menu_main_sort_az) { 
     stupidAdapter.sort(new Comparator<String>() { 
      public int compare(String object1, String object2) { 
       return object1.compareTo(object2); 
      }; 
     }); 
    } else if (id == R.id.menu_main_sort_za) { 
     stupidAdapter.sort(new Comparator<String>() { 
      public int compare(String object1, String object2) { 
       return object2.compareTo(object1); 
      }; 
     }); 
    } 
    stupidAdapter.notifyDataSetChanged(); 
    return true; 
} 

class StupidAdapter extends ArrayAdapter<String> { 

    public StupidAdapter(Context context, List<String> list) { 
     super(context, R.layout.list_item, list); 
    } 

    @Override 
    public View getView(final int position, View row, final ViewGroup parent) { 
     ViewHolder viewHolder; 

     final String item = getItem(position); 

     if (row == null) { 
      row = getLayoutInflater().inflate(R.layout.list_item, parent, false); 
      viewHolder = new ViewHolder(row); 

      row.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) row.getTag(); 
     } 

     viewHolder.refreshData(item); 

     return row; 
    }  

    class ViewHolder { 
     TextView title; 
     public ViewHolder(View row) { 
      this.title = (TextView) row.findViewById(R.id.title); 
     } 
     public void refreshData(final String text) { 
      this.title.setText(text); 
     } 
    } 

} 

} 

list_item.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#ffffffff"> 

<TextView 
    android:id="@+id/title" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:textSize="15sp" 
    android:textColor="#ff000000"/> 

</LinearLayout>   

main_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_main_sort_az" android:title="Sort A-Z"/> 
    <item android:id="@+id/menu_main_sort_za" android:title="Sort Z-A"/> 
</menu> 
+0

これは、ArrayAdapter を拡張しています。そして、はい、私はそれがそのソート方法を持っていることを知っていますが、私はどのように、どこでそれがソートされるのかをもう少しコントロールしたかった。私はOnClickListenerの内部に組み込みのソートメソッドを使ってみましたが、何も起こりませんでした。 – jpalm

+2

ArrayAdapterを拡張するので、独自の配列(myCollections)を保持する必要はありません。問題は発生しますが、ArrayAdapterには独自の配列があります。 – gwa

+0

HclmスーパークラスのgetItem()メソッドとsort自分の配列を完全に削除しても、それでも適切に並べ替えることはできません。それは、私が最後に書いたOnClickListenerからアクセスしたMainMenuArrayAdapterと何か関係がありますか? – jpalm

関連する問題