2011-12-09 37 views
2

我有一個按鈕,應該使用自定義適配器排序ListView。該按鈕偵聽如下:ListView不重繪從OnClickListener

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

的排序順序的變化,因爲它應該和數據在陣列中進行排序,實際的觀點從未被notifyDataSetChanged更新雖然。下面是sortByTitles()方法:

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之一。我究竟做錯了什麼?

編輯

這裏是在適配器類的構造函數:

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

這裏是它如何被在OnCreate(初始化)活動的方法:

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

c1-c6只是一些臨時的CollectionObjects用於測試。

+0

什麼是'myCollections'?將需要查看適配器的更多代碼。 – st0le

+0

我需要看看你如何初始化你的適配器? – st0le

+0

我使用自定義適配器的構造函數編輯了我的問題。 myCollections是一個數組,它包含所有的CollectionObjects – jpalm

回答

2

你正在擴展什麼樣的適配器?我認爲你實際上是在你的適配器中排序項目的一個副本。你是否再次在適配器中設置myCollections?順便說一句,如果你擴展ArrayAdapter請記住,適配器本身有一個接受你自己的比較器的排序方法。

編輯: 我寫了一個超級愚蠢的例子與自定義適配器和排序,你可以按菜單排序項目。希望它會有所幫助!

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(下RES /菜單)

<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

嗯我改變了它使用superclasse的getItem()和sort()方法,完全排除我自己的數組,但它仍然沒有正確排序。是否與MainMenuArrayAdapter有關,我寫的是最終的,可以從OnClickListener訪問? – jpalm

相關問題