随着移动互联网的快速发展,越来越多的应用开始依赖于列表展示,以展示大量信息。Android系统提供了ListView组件,使得这一过程变得轻松。ListView允许我们以列表形式展示数据,支持添加、删除等操作,十分灵活。不过ListView所展示的数据通常会比较复杂,有时需要进行自定义排序,以满足不同的展示需求,那么如何实现在Android中对ListView进行自定义排序呢?接下来,本文将围绕此问题展开探讨。
一、ListView常见排序方式
在理解ListView自定义排序之前,先介绍几种ListView的排序方式:
1.数据按字典序升序排列(默认)
我们往往会以同样的方式展示数据,例如,要列出联系人按A-Z的顺序排序:
![1.png](https://img-blog.csdn.net/20170915155258506)
可以通过适配器中的sort方法完成,代码如下:
```java
Collections.sort(mList); //对mList进行排序,即升序排序
mAdapter.notifyDataSetChanged(); //刷新ListView显示
```
这个方案的缺点是:如果要排序的数据非常复杂,它们将按字典顺序排列,而不是按照我们期望的方式排列。
2.根据某一属性排序
假设我们有一个包含多个城市的Info对象集合,每个Info对象都包含名称name和面积area属性:
![2.png](https://img-blog.csdn.net/20170915155323977)
我们将按城市面积从小到大的顺序来展示数据。在活动的onCreate()方法中进行排序如下:
```java
Collections.sort(infoList, new Comparator
@Override
public int compare(Info info1, Info info2) {
if (info1.getArea() > info2.getArea()) {
return 1;
} else if (info1.getArea() < info2.getArea()) {
return -1;
} else {
return 0;
}
}
});
listView.setAdapter(new InfoAdapter(MainActivity.this, infoList));
```
代码中,先调用sort()方法对集合内的数据进行排序,传入比较器对象Comparator进行排序。比较器对象可以实现compare方法来规定元素排序的规则。
3.根据用户需求排序
有时,我们需要根据用户需求来进行适当的排序。例如,用户需要根据日期或名称或其他参数对数据进行排序。这种情况下我们需要比较器Comparator对象,并将参数传递给他们。
二、ListView自定义排序
上面我们介绍了ListView的默认排序和一些简单的排序方式,但当排序方式比较复杂时,甚至动态的,我们就需要自定义排序了。下面,我们以数据按价格排序为例,来介绍ListView自定义排序的具体实现。
1.自定义Adapter
在理解ListView自定义排序之前,先介绍一下ListView的适配器。Adapter是在Android系统中经常被使用的一个概念,它为ListView提供了数据支持,实质上是一个数据集合的控制器,对所有的元素进行操作。我们需要自定义一个Adapter类,以便在后续排序的时候将数据传递给适配器。
```java
public class GoodsAdapter extends BaseAdapter{
private List
private Context context;
public GoodsAdapter(List
super();
this.list = list;
this.context = context;
}
//重写Adapter方法
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
//设置名称和价格
viewHolder.name.setText(list.get(position).getName());
viewHolder.price.setText(String.valueOf(list.get(position).getPrice()));
return convertView;
}
class ViewHolder {
private TextView name;
private TextView price;
public ViewHolder(View view) {
name = (TextView) view.findViewById(R.id.name);
price = (TextView) view.findViewById(R.id.price);
}
}
}
```
2.排序
定义好适配器之后,我们需要进行数据排序。这里我们通过实现Comparator接口来完成排序:
```java
private void sort() {
Collections.sort(list, new Comparator
@Override
public int compare(Goods goods1, Goods goods2) {
//根据价格升序排序
return goods1.getPrice() - goods2.getPrice();
}
});
adapter.notifyDataSetChanged();
}
```
这里,我们将list集合按照价格进行了升序排序,将比较器传递给集合的sort()方法即可。
3.添加菜单
现在我们需要在菜单中添加一个选项,以便让用户对数据进行排序。代码如下:
```xml
```
4.排序事件
在MainActivity中处理我们添加的菜单项的点击事件,根据用户选择转移到不同的方法中。代码如下:
```java
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_sort_price:
sort();
break;
}
return super.onOptionsItemSelected(item);
}
```
在这个例子中,我们展示了如何以用户需求自定义ListView的排序方式。在实际应用中,我们需要更加具体的根据数据的属性自定义排序方式,以满足不同的需求。
本文围绕ListView实现自定义排序进行了探讨,并进一步介绍ListView的常见排序方式。通过介绍ListView的自定义排序,本文希望能够帮助开发者更好地了解ListView并应用到实际的开发过程中。