【问题标题】:Android listview not sortingAndroid列表视图不排序
【发布时间】:2015-03-11 14:50:48
【问题描述】:

尽管将排序代码添加到支持数组列表,在对象上实现了可比较的接口并在数组适配器的排序函数上设置了比较器,但我的列表视图没有排序。当我通过调试器跟踪代码时,可以看到这些值实际上是正确排序的(按字母顺序),但是,值的渲染视图根本没有排序。

    @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;
            }
        }
    }

我知道我有很多多余的排序代码,一旦我完成这项工作,它们就会被删除,但与此同时,我将非常感谢你们提供的任何帮助。

这是所有 Shaker 排序后呈现的 ListView 的截图:

-->

看来我没有足够的声望点来发布图片,所以如果你想看这里的屏幕截图,这里是我的 g+ 照片的链接: https://lh5.googleusercontent.com/-5YTRcA8RfSI/VQCCXyiN2WI/AAAAAAAAL7Q/XCMSFa4GkcE/w465-h411-no/shakers.png

【问题讨论】:

  • 嗨...您能否将我的答案标记为正确并投票?谢谢... :)

标签: android sorting listview android-studio android-arrayadapter


【解决方案1】:

虽然您的代码在我看来是正确的,但您可以尝试替换

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

【讨论】:

  • 感谢您输入 ZygotInit,但是,它不起作用。我将尝试在此处放置屏幕截图,以便您查看输出。我只是不明白,我之前已经对大量数组进行了排序,在摇摆中授予,但这在技术上应该是相同的......#dumbfounded
  • 屏幕截图已打开,看看它,看看你是否看到了一些我没有看到的非常明显的东西。
  • 已解决!问题源于另一个实现了自己的 dataSetChanged() 并且没有使用任何排序逻辑的类 (Cabine.class)。一旦在所述功能中实现了排序逻辑,一切都很好!感谢 ZygotInit 的参与!干杯芽!
【解决方案2】:

解决了!问题源于另一个实现了自己的 dataSetChanged() 并且没有使用任何排序逻辑的类 (Cabine.class)。一旦在所述功能中实现了排序逻辑,一切都很好!感谢 ZygotInit 的参与!干杯芽! -

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多