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

标签 android sorting android-recyclerview

我在对不同类型的 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"));

我尝试使用比较器:

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

最佳答案

您可以创建 Item0Item1Item 子类(如果它们还没有)。

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

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

class Comparation implements Comparator<Item> {

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

关于android - 如何对不同类型的RecyclerView元素进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39426410/

相关文章:

java - 如何使用android中的recyclerview和数据库将位置明智的对象数据从一个 Activity 传递到另一个 Activity

java - 如何在不触摸的情况下突出显示 mpandroid 饼图的特定部分?

android - 最流行的android开源ui库有哪些

php - 如何使用mysql和php进行排名

android - 是否可以创建一个动态的 RecyclerView 适配器来接受任何对象列表 <Object> 的列表?

java - 如何让按钮选择 recyclerView 中的所有复选框?

android - 使用Closure整理Gradle依赖项

Docker 上的 Android SDK for ARM64 (Raspberry Pi 4) 用于构建 APK

c - C 中的排序算法,使用 qsort 或替代交换方法对指向结构对象的指针数组进行排序

java - NavigableMap 与 SortedMap?