我有一个问题,尽管我向列表数组添加了排序代码,但仍未对列表视图进行排序,在对象上实现了可比较的接口,并在数组适配器的排序功能上设置了比较器。当我通过调试器跟踪代码时,可以看到这些值实际上已正确排序(字母顺序),但是,这些值的渲染视图根本没有排序。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
cabinet = (ListView) rootView.findViewById(R.id.lstCabinet);
final Cabinet cubard = Cabinet.get(getActivity());
List<Shaker> shakers = cubard.getShakers();
ShakerAdapter adapt = new ShakerAdapter((ArrayList<Shaker>) shakers);
adapt.sort(new Comparator<Shaker>() {
@Override
public int compare(Shaker a, Shaker b) {
String a1 = a.getName();
String a2 = b.getName();
return a1.compareTo(a2);
}
});
cabinet.setAdapter(adapt);
Collections.sort(shakers);
adapt.notifyDataSetChanged();
registerForContextMenu(cabinet); //register the context menus for the list elements.
mainActivity.setCabinet(cabinet);
mainActivity.setCubard(cubard);
mainActivity.newShaker = (Button) rootView.findViewById(R.id.btnNewShaker);
cabinet.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent in = new Intent(getActivity(), ShakerViewActivity.class);
in.putExtra(SHAKER, cubard.getShaker(position));
in.putExtra(PASSPHRASE, mainActivity.getPassPhrase());
in.putExtra(SESTRAKER, session);
if (mainActivity.validateSession()) {
if (mainActivity.passPhrase != null && mainActivity.passPhrase.length() > 0) {
startActivity(in);
}
}
}
});
return rootView;
}
以下是ShakerAdapter代码
//private class to overide the array adapter for the list view of the shakers
private class ShakerAdapter extends ArrayAdapter {
ArrayList<Shaker> shakers;
private ShakerAdapter(ArrayList<Shaker> shakers) {
super(getActivity(), 0, shakers);
// Collections.sort(shakers,new Comparator<Shaker>() {
// @Override
// public int compare(Shaker a, Shaker b) {
// String a1 = a.getName();
// String b1 = b.getName();
//
// return a1.compareTo(b1);
//// return a2.compareTo(a1);
// }
// });
Collections.sort(shakers);
this.shakers = shakers;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.shaker_element, null);
}
Shaker shaker = shakers.get(position);
TextView title = (TextView) convertView.findViewById(R.id.tvElementTitle);
title.setText(shaker.getName());
return convertView;
}
}
}
我知道我有很多多余的排序代码,一旦我可以使用,它们将被删除,但是与此同时,我将非常感谢你们提供的任何帮助。
这是所有振动筛都经过排序后呈现的ListView的屏幕截图:
->
看来我没有足够的声誉积分来发布图片,因此,如果您想查看屏幕截图,这里是我的g +照片的链接:
https://lh5.googleusercontent.com/-5YTRcA8RfSI/VQCCXyiN2WI/AAAAAAAAL7Q/XCMSFa4GkcE/w465-h411-no/shakers.png
最佳答案
虽然您的代码对我来说看起来正确,但是您可以尝试替换
adapt.sort(new Comparator<Shaker>() {
@Override
public int compare(Shaker a, Shaker b) {
String a1 = a.getName();
String a2 = b.getName();
return a1.compareTo(a2);
}
});
与
Collections.sort(shakers, new Comparator<Shaker>() {
@Override
public int compare(Shaker a, Shaker b) {
String a1 = a.getName();
String a2 = b.getName();
return a1.compareTo(a2);
}
});
并确保在创建
Adapter
之后对ArrayList
进行排序,即将以下代码行ShakerAdapter adapt = new ShakerAdapter((ArrayList<Shaker>) shakers);
调用
Collections.sort()
之后。