2016-09-10 1 views
2

Ich habe ein Problem mit der Sortierung RecyclerView Artikel mit verschiedenen Typen. Zum Beispiel habe ich eine solche RecyclerView.Adapter:Wie RecyclerView Elemente mit verschiedenen Typen zu sortieren?

public class StudyRVadapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

private List<Item> data; 

public RVadapter(List<Item> src){ 
    data = src; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    RecyclerView.ViewHolder vh; 

    switch (viewType){ 
     case 0: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_0, parent, false); 
      vh = new ViewHolderZero(view); 
      break; 

     case 1: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_1, parent, false); 
      vh = new ViewHolderOne(view); 
      break; 

     default: vh=null; 
    } 
    return vh; 
} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

    if (Item0.class.isInstance(data.get(position))){ 
     Item0 item0 = (Item0)data.get(position); 
     ((ViewHolderZero)holder).text.setText(item0.toStringText()); 
     } 
    if (Item1.class.isInstance(data.get(position))){ 
     Item1 item1 = (Item1)data.get(position); 
     ((ViewHolderOne)holder).text.setText(item1.toStringText()); 
    }  
} 

@Override 
public int getItemViewType(int position) throws IllegalArgumentException { 
    Item item = data.get(position); 
    if (Item0.class.isInstance(item)) return 0; 
    if (Item1.class.isInstance(item)) return 1; 
    throw new IllegalArgumentException("Unknown element"); 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

public class ViewHolderZero extends RecyclerView.ViewHolder{ 

    TextView text; 

    public ViewHolderZero(View itemView) { 
     super(itemView); 
     text = (TextView)itemView.findViewById(R.id.tvItem0); 

    } 
} 

public class ViewHolderOne extends RecyclerView.ViewHolder { 
    TextView text2; 

    public ViewHolderOne(View itemView) { 
     super(itemView); 
     text = (TextView)itemView.findViewById(R.id.tvItem1); 
    } 
} 

In meinem Haupt Activity i LinkedList erstellen und fügen Sie Elemente mit Typen "Item0" und "Element1":

LinkedList<Item> ll = new LinkedList<>(); 
ll.add(0, new Item0("abc")); 
ll.add(1, new Item1("bca")); 

ich versuchte Comparator zu verwenden:

class Comparation implements Comparator<Item> { 

    public int compare(Item0 lhs, Item1 rhs) { 

     if (lhs.getText() < rhs.getText()){ 
      return 1; 
     }else return -1; 
    } 
} 

Aber es funktioniert nicht wegen falscher Argumente in compare().

Wenn ich richtig verstehe, kann ich Collections.sort() und Comparator für Liste verwenden, die aus gleichartigen Elementen besteht. Aber wie kann ich verschiedenartige Elemente sortieren?

Antwort

2

Sie könnten Item0 und Item1 Unterklassen von Item machen (wenn sie nicht bereits sind).

getText() sollte eine Methode von Item sein (die Item1 und Item2 erbt).

Danach kann man sich richtig vergleichen zu können, da sie von der gleichen Art sind:

class Comparation implements Comparator<Item> { 

    public int compare(Item lhs, Item rhs) { 
     // your comparation logic 
    } 
} 
+2

Als Bonus: Wenn 'getText()' gibt einen String (oder hat einen 'toString()') Methode können Sie auch einfach tun: 'return lhs.getText(). compareTo (rhs.getText())' – Aystub

Verwandte Themen