我有一个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没有排序......
我做错了什么?
答案 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)
答案 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)
@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)