如何在android中按数值列对listview项目进行排序

Posted

技术标签:

【中文标题】如何在android中按数值列对listview项目进行排序【英文标题】:How to sort listview items by numeric values column in android 【发布时间】: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);
        

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

【问题讨论】:

【参考方案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。在我看来,这与缺少括号无关。声明 似乎存在冲突 我已经添加了完整的代码实现。如果您在理解代码方面仍然遇到任何问题,请告诉我。

以上是关于如何在android中按数值列对listview项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在android的ListView数据中按数字格式搜索

如何在c#中按两列对DataTable进行排序

如果单击标题视图,如何在表格视图中按列对数据进行排序

使用 NaN 在 pandas 中按列对数据进行 Winsorizing

如何在Android中按半径约束布局项

在C#中按列对二维数组进行排序