ListView的数据排序示例

ListView的数据排序示例

         ListView中经常要用到对里面的条目的某一个数据进行排序,比如商品的价格、销售量,机票的数量、价格等。并且有些还要对某些条目进行记录(删除或保留另用)。这里简单实现了一下效果。代码也分享给大家。

效果:
s

         说明:这里点击名称的第一次时,按选中的升序排列,点击第二次时,按选中的降序排列,后面点击都是切换按升降序。
         点击右边的“禁用”按钮,按钮的文字变成“启动”,并且这个数据保存下来。
         点击“编辑”按钮,可以选择清除所有的“禁用”。
         点击“详情”按钮,就会对剩下的数据进行分析,图表显示(图表具体的代码可以自己设计)

这里涉及到几个比较难的知识:

(一)上下箭头的设计(动态添加图片)

         使用方法: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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值