如何对不同类型的RecyclerView元素进行排序?

问题描述 投票:0回答:1

我在对不同类型的

RecyclerView
项目进行排序时遇到问题。比如我有这样的
RecyclerView.Adapter
:

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
来表示列表,它由相同类型的元素组成。但是如何对不同类型的元素进行排序呢?

android sorting android-recyclerview
1个回答
2
投票

您可以创建

Item0
Item1
Item
的子类(如果还没有)。

getText()
应该是
Item
的方法(
Item1
Item2
将继承)。

之后,您可以正确比较它们,因为它们是同一类型:

class Comparation implements Comparator<Item> {

    public int compare(Item lhs, Item rhs) {
        // your comparation logic
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.