【问题标题】:Sorting of ListView by Name of the Product using Custom adaptor?使用自定义适配器按产品名称对 ListView 进行排序?
【发布时间】:2012-02-13 01:53:28
【问题描述】:

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

我的课是:

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&lt;RowData&gt; 的自定义适配器。

我在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 时,它没有按排序顺序显示。

我是安卓新手,请帮帮我。


感谢 Alex Lockwood,我正在使用 ArrayAdaptor&lt;Class&gt; 类型的自定义适配器。

在我的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);
}

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

提前致谢。

【问题讨论】:

  • 确保您的“CustomAdapter”能够显示普通数组或ArrayList。当这可行时 - 您还应该能够显示已排序的数据集。
  • 当您将新适配器设置为列表时,您不需要使用 notifyDataSetChanged() 方法。只需粘贴您的适配器代码和活动代码。
  • 谢谢 Copa 能否请您提供相同的代码,或者请您帮助我使用代码
  • 感谢 jitendra sharma 但即使在删除 notifyDataSetChanged() 方法后它也无法正常工作
  • 请使用正确的大小写,下次尝试更好地格式化您的代码。如果您的代码易于阅读,人们更有可能提供帮助:)。

标签: java android android-listview


【解决方案1】:

如果您想对区域敏感的字符串进行排序,请使用 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);
    }
});

【讨论】:

    【解决方案2】:

    如果您使用ArrayAdapter,您可以在适配器上调用sort 并传递Comparator。如何实现 Comparator 取决于您。


    编辑我:

    您不需要重写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();
    

    【讨论】:

    • hanks Alex Lockwood 请看我下面的查询
    • 感谢“Alex Lockwood”,现在解决了我在 getView() 方法中遇到的问题跨度>
    • 请参阅this 如何按名称对列表视图进行排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2012-07-12
    相关资源
    最近更新 更多