我有一个问题,尽管我向列表数组添加了排序代码,但仍未对列表视图进行排序,在对象上实现了可比较的接口,并在数组适配器的排序功能上设置了比较器。当我通过调试器跟踪代码时,可以看到这些值实际上已正确排序(字母顺序),但是,这些值的渲染视图根本没有排序。

    @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()之后。

10-07 19:01
查看更多