ListView的数据排序示例
ListView中经常要用到对里面的条目的某一个数据进行排序,比如商品的价格、销售量,机票的数量、价格等。并且有些还要对某些条目进行记录(删除或保留另用)。这里简单实现了一下效果。代码也分享给大家。
效果:
说明:这里点击名称的第一次时,按选中的升序排列,点击第二次时,按选中的降序排列,后面点击都是切换按升降序。
点击右边的“禁用”按钮,按钮的文字变成“启动”,并且这个数据保存下来。
点击“编辑”按钮,可以选择清除所有的“禁用”。
点击“详情”按钮,就会对剩下的数据进行分析,图表显示(图表具体的代码可以自己设计)
这里涉及到几个比较难的知识:
(一)上下箭头的设计(动态添加图片)
使用方法:setCompoundDrawables();可以传入四个Drawable参数,表示在文本的上下左右放入图片对象,如果参数是空,表示不用插入。
代码如下:
//排序的图标
Drawable picture_up;
Drawable picture_down;
picture_up = getResources().getDrawable(R.drawable.up);
picture_down = getResources().getDrawable(R.drawable.down1);
picture_down.setBounds(0, 0, picture_down.getMinimumWidth(), picture_down.getMinimumHeight());
picture_up.setBounds(0, 0, picture_up.getMinimumWidth(), picture_up.getMinimumHeight());
//对按钮对象设置(这里是在右边设置图片)四个参数代表上下左右
button.setCompoundDrawables(null, null, picture_down, null);
(二)选中“禁用”条目,的设计思想
这里“禁用”和“启用”文字的转换,不能用这个Button的Check状态判断,因为View的复用,会把状态保存,列表向下拉再向上拉后很多按钮的状态就会混乱。
这里需要使用集合保存选中的条目的唯一标识(这里是日期字符串),每点击一次,集合的数据添加一个,如果数据已经存在就删除,并且刷新一下适配器。
(三)排序的实现
使用的方法是Collections.sort(list,class),传人两个对象就可以了,一个是集合的对象,另一个是实现了Comparator的类对象。
这里使用的是接口Comparator。Comparator是在集合外部实现的排序,位于java.lang下,是一个专用的比较器。
这里延伸一下:Comparable是在集合内部定义的方法实现的排序,位于java.util下。如果是使用静态排序一般使用Comparable,添加的时候就会帮你排序,但是如果要动态排序,一般使用Comparator接口排序。
Comparator排序需要两个元素,一个是Bean类,一个是实现了Comparator接口的类,然后就可以使用方法Collections.sort对List集合进行排序。
比如,下面这个简单实例:
1.这个一个Student的Bean类
package com.xykj.comparatorTest;
public class Student {
//创建两个基本属性
String name="";
int age=0;
//从写构造方法用来传递数据
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//从写toString方法,方便显示
@Override
public String toString() {
return name + " " + age ;
}
//基本属性的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.继承接口的实现类
(1)创建按照姓名升序排列的实现类
package com.xykj.comparatorTest;
import java.util.Comparator;
//按照名字的升序排列 实现接口 泛型是自定义类,里面有要排序的内容
public class NameSort implements Comparator<Student>{
@Override //两个参数是泛型的对象
public int compare(Student o1, Student o2) {
//按照姓名的升序排列,前面加个负号就按照降序排列
return o1.getName().compareTo(o2.getName());
}
}
(2)创建按照年龄升序排列的实现类
package com.xykj.comparatorTest;
import java.util.Comparator;
//按照年龄的升序排列 实现接口 泛型是自定义类,里面有要排序的内容
public class AgeSort implements Comparator<Student>{
@Override //两个参数是泛型的对象
public int compare(Student o1, Student o2) {
//按照姓名的升序排列,前面加个负号就按照降序排列
return o1.getAge()-o2.getAge();
}
}
3.可以直接使用了,方法:Collections.sort
package com.xykj.comparatorTest;
import java.util.ArrayList;
import java.util.Collections;
public class MainClass {
/**
* comparator的使用
* */
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("1wenzhi", 18));
list.add(new Student("3wenzhi", 19));
list.add(new Student("2wenzhi", 33));
list.add(new Student("66wenzhi", 10));
list.add(new Student("4wenzhi", 18));
System.out.println("=========排序前=======");
for (Student student : list) {
System.out.println(student);
}
// 按照年龄升序排列
Collections.sort(list, new AgeSort());
System.out.println("=========排序后=======");
for (Student student : list) {
System.out.println(student);
}
}
}
当然程序中还是有一些复杂的逻辑实现。
下面是我的一个源码供大家参考(有些类名是乱写的!但是功能是实现了的):
http://download.csdn.net/detail/wenzhi20102321/9793484
下面是我的一个关于集合数据的排序总结(有所有的集合详解和接口comparable和接口comparator的比较):
http://blog.csdn.net/wenzhi20102321/article/details/52494402