2016-03-08 69 views
0

我有ListView。每個Item得到3 TextViewsItems如何按照字母順序排列的TextView如何在ListView中對項目進行排序

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; 


} 
} 

我想整理應在adapter代碼進行。我看了類似的問題,但他們與TextViewItems合作,這意味着他們可以簡單地比較和排序內String[]內的值。如果我在這裏做類似的事情,我只會搞砸名單,因爲名字和信息不會對應。

+0

Arrays.sort(string_arr); – Ajinkya

回答

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; 
} 

然後在活動我用這個:

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更改 - 它允許動態排序。

如果這看起來很混亂,請嘗試僅使用鏈接中提供的代碼,並且只能在嘗試修改它之後嘗試。

0

使用Comparator接口並對列表進行排序,然後將數據設置爲適配器。

0

考慮將與單行相關的所有數據(即名稱,圖像路徑,性別和年齡)包裝在一個類中,然後對這些對象的集合進行排序。

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; 
      } 
     }); 
+0

我應該把它放在適配器或活動? –

+0

用新的排序數組再次設置適配器 –

+0

然後它是活動。 –

0

我會建議你保持整個數據集在一個單一的數據結構,使用Comparator實例對它們進行排序並保持該數據集的副本。

首先創建名稱,年齡,性別,imagePath的POJO。這樣您就不必分別對每個集合進行排序。

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

其次,將這些Person實例存儲在集合中。讓我們假設我們正在使用java數組,就像您使用適配器示例一樣。

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允許你通過採取多態的優勢,支持開/關原則。事情如何排序不再是適配器的責任。

0

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

List<Type> data_source,order; 

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

我希望幫助這個

+0

我應該把這個在MainActivity? –

+0

是的,你把活動或片段都工作 –

相關問題