2016-09-10 4 views
2

У меня проблема с сортировкой RecyclerView элементов разных типов. Например у меня есть такие RecyclerView.Adapter:Как отсортировать элементы RecyclerView с разными типами?

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

В моей основной Activity я создать LinkedList и добавлять элементы с типами "Item0" и "ITEM1":

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

я пытался использовать Comparator:

class Comparation implements Comparator<Item> { 

    public int compare(Item0 lhs, Item1 rhs) { 

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

Но это не работает из-за неправильных аргументов в compare().

Если я правильно понимаю, я могу использовать Collections.sort() и Comparator для списка, который состоит из элементов одного типа. Но как я могу сортировать элементы другого типа?

ответ

2

Вы можете сделать Item0 и Item1 подклассами Item (если их еще нет).

getText() должен быть метод Item (который наследует Item11010 и Item2).

После этого, вы можете сравнить их должным образом, так как они того же типа:

class Comparation implements Comparator<Item> { 

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

В качестве бонуса: если 'GetText()' возвращает строку (или имеет 'ToString()') метод, вы также можете просто сделать: 'return lhs.getText(). compareTo (rhs.getText())' – Aystub

Смежные вопросы