【问题标题】:How to sort listview items by numeric values column in android如何在android中按数值列对listview项目进行排序
【发布时间】:2020-08-28 13:55:25
【问题描述】:

我有一个列表视图 lv,其中包含以下项目:

Hyda, 25.00
Bran, 11.75
Geda, 2.55

我想按第二列对项目进行排序,以便列表视图显示:

Geda, 2.55
Bran, 11.75
Hyda, 25.00

我在下面使用的代码仅按第一列排序;即它返回:

Bran, 11.75
Geda, 2.55
Hyda, 25.00

ArrayList<String> list = new ArrayList<>();
        ArrayAdapter<String> adapter;

        lv = rootView.findViewById(R.id.lvData);
        adapter = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1, list);

        list.add("Hyda"+", "+"25.00");
        list.add("Bran"+", "+"11.75");
        list.add("Geda"+", "+"2.55");


        lv.setAdapter(adapter);


        btnSort = rootView.findViewById(R.id.sortButton);
        btnSort.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Collections.sort(list,new myComparatorNumbers());
                for (String i:list){
                   lv.setAdapter(adapter);
                }                
            }
        });

        private class myComparatorNumbers implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }

任何人都可以帮助如何按第二列(即按数值)对其进行排序吗?我发现的大多数解决方案都集中在一个列数据数组上

【问题讨论】:

    标签: android sorting android-listview


    【解决方案1】:

    似乎我的旧答案无法帮助您,我现在正在添加完整的实现。它肯定会帮助你

    class User {
        String name;
        double score;
    
        User(String name, double score) {
            this.name = name;
            this.score = score;
        }
    }
    

    主活动

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button sortButton = findViewById(R.id.sortButton);
            ListView lv = findViewById(R.id.lvData);
    
            List<User> data = new ArrayList<>();
            data.add(new User("Bran", 11.75));
            data.add(new User("Geda", 2.55));
            data.add(new User("Hyda", 25.00));
    
            final UsersAdapter adapter = new UsersAdapter(this, data);
            lv.setAdapter(adapter);
            sortButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    adapter.sortLvData();
                }
            });
        }
    }
    

    自定义适配器类

    class UsersAdapter extends ArrayAdapter<User> {
    
        UsersAdapter(@NonNull Context context, List<User> users) {
            super(context, 0, users);
        }
    
        void sortLvData() {
            sort(new Comparator<User>() {
                @Override
                public int compare(User u1, User u2) {
                    return Double.compare(u1.score, u2.score);
                }
            });
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            User user = getItem(position);
            if (convertView == null) {
            //you can even use your custom XML layout to better display the UI.
            convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            }
            String text = user.name + ", " + user.score;
            ((TextView) convertView).setText(text);
            return convertView;
        }
    }
    

    【讨论】:

    • 谢谢卡兰。你能检查一下大括号吗?它确实有一些问题
    • 哦,加上缺少的括号,我什至改进了我的答案。谢谢!
    • 它仍然无法正常工作。对于使用类 Person,ArrayAdapter 不起作用。当我使用 Adapter 时,新的适配器需要一个不同的列表,比如 list2。在我看来,这与缺少括号无关。声明 似乎存在冲突
    • 我已经添加了完整的代码实现。如果您在理解代码方面仍然遇到任何问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多