如何在ListView中对项目进行排序

时间:2016-03-08 11:38:30

标签: java android sorting listview

我有ListView。每个Item得到3 TextViews。如何按字母顺序对ItemsTextView的{​​{1}}进行排序{/ 1}}?

我的id代码如下:

Adapter

我认为应该在public class CustomList extends ArrayAdapter<String>{ private final Activity context; private final String[] textName; private final String[] imagePath; private final String[] textAge; private final String[] textSex; public CustomList(Activity context, String[] imagePath, String[] textName, String[] textSex, String[] textAge) { super(context, R.layout.listview_row, textName); this.context = context; this.textName = textName; this.imagePath = imagePath; this.textAge = textAge; this.textSex = textSex; } @Override public View getView(int position, View view, ViewGroup parent) { LayoutInflater inflater = context.getLayoutInflater(); View rowView= inflater.inflate(R.layout.listview_row_mix, null, false); TextView txtTitle = (TextView) rowView.findViewById(R.id.NameText); TextView txtSex = (TextView) rowView.findViewById(R.id.SexText); TextView txtAge = (TextView) rowView.findViewById(R.id.AgeText); ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); txtTitle.setText(textName[position]); txtSex.setText(textSex[position]); txtAge.setText(textAge[position]); String root = Environment.getExternalStorageDirectory().toString(); File imageFile = new File(root + "/WorkImages/" + imagePath[position]); Log.i("Debug", imageFile.toString()); if(imageFile.exists()){ Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); imageView.setImageBitmap(myBitmap); Log.i("Debug", imageFile.toString()); }else{ imageView.setImageResource(R.drawable.profile_icon);} return rowView; } } 代码中进行排序。我查看了类似的问题,但他们使用了1 adapter TextView,这意味着他们可以简单地对Items内的值进行比较和排序。如果我在这里做类似的话,我会搞砸列表,因为名字和信息不一致。

7 个答案:

答案 0 :(得分:0)

使用Comparator界面并对列表进行排序,然后将数据设置为适配器。

答案 1 :(得分:0)

考虑在一个类中包装与单行相关的所有数据(即名称,图像路径,性别和年龄),然后对这些对象的集合进行排序。

答案 2 :(得分:0)

您可以使用比较器并对列表数据进行排序

  Collections.sort(array, new Comparator<ListData>() {


           @Override
            public int compare(ListData s1, ListData s2) {
                int returnValue = 0;
                if (!s1.getName().toLowerCase().startsWith(str.toLowerCase())
                        && !s2.getName().toLowerCase().startsWith(str.toLowerCase())
                        || s1.getName().toLowerCase().startsWith(str.toLowerCase())
                        && s2.getName().toLowerCase().startsWith(str.toLowerCase())) {
                    returnValue = s1.getName().compareToIgnoreCase(s2.getName());
                } else {
                    if (s1.getName().toLowerCase().startsWith(str.toLowerCase())) {
                        returnValue = -1;
                    } else {
                        returnValue = 1;
                    }
                }
                return returnValue;
            }
        });

答案 3 :(得分:0)

我建议您将整个数据集保存在单个数据结构中,使用Comparator实例对其进行排序并保存该数据集的副本。

首先创建名称,年龄,性别,imagePath的POJO。这样您就不必单独对每个集合进行排序。

public class Person {
    public String imagePath;
    public String name;
    public String age;
    public String sex;
} 

其次,将这些Person实例存储在集合中。让我们假设我们正在使用java Array,就像使用适配器示例一样。

public class CustomList extends ArrayAdapter<String> {
    private final Person[] people;
    // Other stuff...
}

现在,让我们添加Comparator实例和数据集副本。

public class CustomList extends ArrayAdapter<String> {
    private final Person[] people;
    private Comparator<Person> comparator;
    private Person[] peopleSorted;

    // Other stuff...
}

因此,最终Adapter实施将类似于

public class CustomList extends ArrayAdapter<String> {
    private final Person[] people;
    private Comparator<Person> comparator;
    private Person[] peopleSorted;

    public CustomList(Activity context, Person[] people) {
        super(context, R.layout.listview_row, textName);
        this.context = context;
        this.people = people;
        this.peopleSorted = Arrays.copyOf(people, people.length);
    }

    public void sort(Comparator<Person> comparator) {
        if (comparator == null) {
            peopleSorted = Arrays.copyOf(people, people.length);
        }
        else {
            Arrays.sort(peopleSorted, comparator);
        }

        // It is up to you to call notifyDataSetChanged implicitly here, or calling it explicitly from somewhere else. 
    }

    public void getCount() {
        return peopleSorted.length;
    }

    // Other stuff...
}

请注意,排序API允许您通过利用多态来支持开放/封闭原则。事情将如何排序不再是适配器的责任。

答案 4 :(得分:0)

您可以使用直接列表,如下例

List<Type> data_source,order;

Collections.sort(data_source);
//or
Collections.sort(data_source, new Sorter(order));

我希望帮助

答案 5 :(得分:0)

我使用this作为参考。

而是Dog(String n, int a),我写了一些东西以满足我的需要。在这种情况下Dog(String a, String b, String c, String d)。然后我添加类似于

的功能
public string getDogName(){
return name;
}

public string getDogSex(){
return sex;
}

然后在活动I中使用:

list.add(new Dog(a[pos], b[pos], c[pos], d[pos]));

其中a, b, c, dString[]

排序本身是用

完成的
Collections.sort(list);

如果要更改确切排序的内容,请更改此字符串。

return (this.name).compareTo(d.name);

你写了多种可能性,比如return (this.age).compareTo(d.age);, 用if语句包围它们。

if(counter == 1){
return (this.name).compareTo(d.name);
}

其中,计数器为public static int;。该值通过button.onClickListener更改 - 它允许动态排序。

如果这看起来令人困惑,请尝试仅使用链接中提供的代码,并且仅在尝试修改它之后。

答案 6 :(得分:-1)

默认情况下,这会按升序对数据进行排序。

Collections.sort(galaxiesList);

然后我们可以将其反转为下降,这与上升相反:

Collections.reverse(galaxiesList)