使用自定义适配器按产品名称对ListView进行排序?

时间:2012-01-18 10:27:02

标签: java android android-listview

我想按产品名称对ListView的项目进行排序。我有一个名为“data”的向量,它是一种类。

我上课的是:

public static class RowData implements Comparable<RowData>{
    public String mProductName;
    protected int mId;

    protected int mOnHand;
    protected double mPrice;
    protected boolean mIsColleaction;
    protected boolean mIsPrePack;

    RowData(int id ,String productName,int onhand,double price,boolean IsColleaction, boolean IsPrePack) {
        mId= id;
        mProductName= productName;
        mOnHand =onhand;
        mPrice = price;
        mIsColleaction =IsColleaction;
        mIsPrePack = IsPrePack;
    }

    @Override
    public String toString() {
        return mProductName;
    }

    public int compareTo(RowData other) {
        return mProductName.compareTo(other.mProductName);
    }

    public static Comparator<RowData> COMPARE_BY_PRODUCTNAME = new Comparator<RowData>() {
        public int compare(RowData one, RowData other) {
            return one.mProductName.compareTo(other.mProductName);
        }
    };
}

我已经使用了一个扩展ArrayAdapter<RowData>的自定义适配器。

我在onCreate()中编写的排序代码如下,

Collections.sort(data, RowData.COMPARE_BY_PRODUCTNAME);
adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

setListAdapter(adapter);
adapter.notifyDataSetChanged();

我必须使用自定义适配器,因为它显示产品的价格以及产品的数量

数据是RowData类型的向量我在调试之后按照我想要的产品名称的排序顺序得到但是当绑定到ListView时它没有按排序顺序显示。 / p>

我是新来的android请帮助我。


感谢Alex Lockwood,我正在使用ArrayAdaptor<Class>类型的自定义适配器。

在我的onCreate()方法中,我正在实现如下所示的排序方法,

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
        return arg0.mProductName.compareTo(arg1.mProductName);
    }
});

setListAdapter(adapter);

在我的customAdaptor课程中,我必须像这样覆盖sort

public void sort(Comparator<? super RowData> comparator) {
    // TODO Auto-generated method stub
    super.sort(comparator);
}

如果您可以修改上述代码或建议我使用您的代码,请帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:18)

如果您使用的是ArrayAdapter,则可以在适配器上拨打sort并传递Comparator。您如何实施Comparator取决于您自己。


编辑I:

您不需要覆盖sort ... ArrayAdapter类为您实现。您需要做的就是创建自己的Comparator,它将按照您希望它们出现的方式对泛型类型对象进行排序。此外,如果在运行时对列表进行排序,则可能需要通知应用程序数据集已更改。如果使用这种方法,您的代码应该可以正常工作。

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
        return arg0.mProductName.compareTo(arg1.mProductName);
    }
});

setListAdapter(adapter);
adapter.notifyDataSetChanged();

答案 1 :(得分:4)

如果要对区域设置敏感的字符串进行排序,请使用Collator类,例如用德语:A,Ä,B

final Collator col = Collator.getInstance();
adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
       return col.compare(arg0.mProductName, arg1.mProductName);
    }
});