我有ListView
。每个Item
得到3 TextViews
。如何按字母顺序对Items
某TextView
的{{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
内的值进行比较和排序。如果我在这里做类似的话,我会搞砸列表,因为名字和信息不一致。
答案 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, d
为String[]
排序本身是用
完成的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)