2011-12-09 21 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

相关问题