使用数组适配器对listview排序

时间:2012-03-28 11:23:16

标签: android listview sorting

我有一个listview连接到自定义数组适配器。此列表显示TCP连接收到的更改dataSet ...

的信息

我可以使用sort (Comparator<? super T> comparator)对列表视图进行排序,但是当更改数据集时,列表视图不再排序......

每次更改dataSet时我都可以使用sort (),但我认为这不是最佳选择...

我该怎么做?有什么建议吗?

修改

我在实施所提出的解决方案时遇到了问题......

MyComparatorB.java

public class MyComparatorB implements Comparator<DeviceB> {

private byte orderType;

public MyComparatorB(byte type) {

    this.orderType = type;

}

public int compare(DeviceB lhs, DeviceB rhs) {

    int res = 0;
    if (orderType == SortType.ALPHA) {
            res = (lhs.getName()).compareTo(rhs.getName());
        }
        else if (orderType == SortType.LAST_ACT) {
            res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime());
        }
        return res;
    }

}

我的customArrayAdapter.java的片段

    @Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}


//-----------Order the content of the arrayAdapter------------//
public void sort(byte sortType) {

    super.sort(new MyComparatorB(sortType));
    notifyDataSetChanged();
}

在我的MyActivity.java

myDevAdapter.sort(SortType.ALPHA);

当我调试时,调用方法super.sort(new MyComparatorB(sortType));并调用MyComparatorB的构造函数。但是从不调用方法compare(DeviceB lhs, DeviceB rhs)并且我的arrayList没有排序...... 我做错了什么?

8 个答案:

答案 0 :(得分:43)

我猜您需要覆盖适配器中的 notifyDataSetChanged 方法,并在调用 super 之前执行排序。见下文:

@Override
public void notifyDataSetChanged() {
    //do your sorting here

    super.notifyDataSetChanged();
}

每当您调用notifyDataSetChanged方法刷新列表项时,这样做会对列表进行排序。否则,将已排序的列表/数组提供给适配器。


或者更优选地,使用适配器中提供的sort方法来完成工作。

adapter.sort(new Comparator<String>() {
    @Override
    public int compare(String lhs, String rhs) {
        return lhs.compareTo(rhs);   //or whatever your sorting algorithm
    }
});

答案 1 :(得分:4)

  • 将数据存储到ArrayList
  • 将阵列附加到适配器
  • 排序数组并分配给自己
  • 使用notifyDataSetChanged()刷新适配器

答案 2 :(得分:2)

这对我有用

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {
        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareTo(rhs);
        }
    });

    this.setNotifyOnChange(true);
}

答案 3 :(得分:1)

Per elBradford关于由notifyDataSetChanged()方法导致堆栈溢出的可能性的评论,我最终覆盖了ArrayAdapter的add()方法,以确保项目在逐个添加时保持排序的一致性。 (当调用addAll()时,我正在对项目进行排序;但我想你也可以覆盖addAll())。

    @Override
    public void add(ListThing object) {
        super.add(object);
        this.sort(ListThing.sComparator);
    }

答案 4 :(得分:0)

由于适配器填充ListView,唯一的方法是以排序的方式传递数据对象。

答案 5 :(得分:0)

列表视图排序后,从您的活动中调用adapter.notifyDataSetChanged()。

答案 6 :(得分:0)

基于waqaslamKristianR的回答:

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    });

    super.notifyDataSetChanged();
    this.setNotifyOnChange(true);
}

希望它有所帮助。

答案 7 :(得分:0)

初始化 ArrayAdapter 并声明我们正在将字符串转换为视图

val arrayAdapter = ArrayAdapter<String>(
            requireActivity(),
            R.layout.item_sample,
            R.id.tv_item_sample,
            samplesArray
)

使用 setAdapter() 将 Adapter 设置为 ListView

binding.lvSample.adapter = arrayAdapter

执行排序并更新适配器。

arrayAdapter.sort { lhs, rhs -> lhs!!.compareTo(rhs!!) }
arrayAdapter.setNotifyOnChange(true)