繁体   English   中英

如何在Android中使用两个不同的模型类对arraylist进行排序?

[英]How to sort the arraylist with two different model class in android?

我正在使用类别和未分类的产品模型类的数组列表创建网格视图。 现在,我想按日期或名称对列表进行排序。 请参阅下面的代码。

这是我的适配器。

public class CommonAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater inflator = null;
private List<Object> list;

public CommonAdapter(Context mContext, List<Object> list) {
    super();
    this.mContext = mContext;
    this.list = list;
    inflator = LayoutInflater.from(mContext);
}


@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    if (convertView == null) {
        convertView = inflator.inflate(R.layout.row_categories, null);
        holder = new ViewHolder();
        holder.layout_bg = (RelativeLayout) convertView.findViewById(R.id.grid_bg);
        holder.titleTextView = (TextView) convertView.findViewById(R.id.grid_item_title);
        holder.txt_price = (TextView) convertView.findViewById(R.id.txt_price);
        holder.img_notifier = (ImageView) convertView.findViewById(R.id.img_notifier);
        holder.titleTextView.setTextColor(Color.WHITE);
        holder.titleTextView.setTextSize(27);
        holder.titleTextView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);
        holder.titleTextView.setLayoutParams(new RelativeLayout.LayoutParams(200, 200));
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    if (list.get(position) instanceof Product) {
        holder.titleTextView.setText(((Product) list.get(position)).getShortCode());
        holder.img_notifier.setVisibility(ImageView.GONE);
        holder.txt_price.setVisibility(TextView.VISIBLE);
        NumberFormat format = NumberFormat.getCurrencyInstance();
        double amount = Double.parseDouble(((Product) list.get(position)).getPrice()toString());
        String formatAmount = NumberFormat.getCurrencyInstance().format(amount / 100);
        holder.txt_price.setText(formatAmount);
    }
    if (list.get(position) instanceof Category) {
        holder.titleTextView.setText(((CategoryWithProduct) list.get(position)).getShortCode());
        holder.img_notifier.setVisibility(ImageView.VISIBLE);
        holder.txt_price.setVisibility(TextView.GONE);
        if (((Category) list.get(position)).getColor() != null) {
            holder.layout_bg.setBackgroundColor(Color.parseColor(((Category) list.get(position)).getColor()));
        } else {
        }
    }
    return convertView;
}

static class ViewHolder {
    RelativeLayout layout_bg;
    TextView titleTextView, txt_price;
    ImageView img_notifier;
}

这是产品模型类

public class Product {
String id;
String name;
String price;
String createAt;

public Product(String id, String name, String price, String createAt) {
    this.id = id;
    this.name = name;
    this.price = price;
    this.createAt = createAt;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPrice() {
    return price;
}

public void setPrice(String price) {
    this.price = price;
}

public String getCreateAt() {
    return createAt;
}

public void setCreateAt(String createAt) {
    this.createAt = createAt;
}
}

这是类别模型

public class Category {
String id;
String name;
String createAt;

public Category(String id, String name, String createAt) {
    this.id = id;
    this.name = name;
    this.createAt = createAt;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCreateAt() {
    return createAt;
}

public void setCreateAt(String createAt) {
    this.createAt = createAt;
}
}

在MainActivity.java中

CommonAdapter commonAdapter = new CommonAdapter(getActivity(), commonArrayList);
grid_common.setAdapter(commonAdapter);

在这里,我尝试使用比较器,它仅带有对象!

Collections.sort(commonArrayList, new Comparator<Object>() {
                    @Override
                    public int compare(Object o1, Object o2) {
                        return 0;
                    }
                });

看到这里两个模型都有createAt和name字段,所以我想在这个ArrayList中按createAt或名称排序。

创建另一个对象模型类,并将所有方法和变量添加到两个单独的类中……然后手动设置数据……使用for循环和其他适合您的..

然后您创建了第三个用于对数据进行排序的对象模型...

编辑

例如: 头等舱

class first{
    String f_name,l_name;

    public String getF_name() {
        return f_name;
    }

    public void setF_name(String f_name) {
        this.f_name = f_name;
    }

    public String getL_name() {
        return l_name;
    }

    public void setL_name(String l_name) {
        this.l_name = l_name;
    }
}

二等

public class second {

String f_name,l_name,m_name;

public String getF_name() {
    return f_name;
}

public void setF_name(String f_name) {
    this.f_name = f_name;
}

public String getL_name() {
    return l_name;
}

public void setL_name(String l_name) {
    this.l_name = l_name;
}


public String getM_name() {
    return m_name;
}

public void setM_name(String m_name) {
    this.m_name = m_name;
}
}

第三类

public class third{

String f_name,l_name,m_name;

public String getF_name() {
    return f_name;
}

public void setF_name(String f_name) {
    this.f_name = f_name;
}

public String getL_name() {
    return l_name;
}

public void setL_name(String l_name) {
    this.l_name = l_name;
}


public String getM_name() {
    return m_name;
}

public void setM_name(String m_name) {
    this.m_name = m_name;
}
}

将第一和第二的所有值设置为第三...

并使用第三类设置数据和排序数据

这是我的建议:

public class Category {
    String id;
    String name;
    String createAt;
       ...
}
public class Product extends Category{
    String price;
     ....
}

Collections.sort(commonArrayList, new Comparator<Category>() {
                    @Override
                    public int compare(Category o1, Category o2) {
                        if(o1.getCreateAt()>o2.getCreateAt()){
                           return 1;
                         }else{
                            ...
                         }
                        return 0;
                    }
                });

创建一个抽象类,将“ Product和“ Category公共字段放入并比较该类。

public abstract class BaseClass {
private String id;
private String name;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

您的Public课:

public class Product extends BaseClass {
    ...

    public Product(String id, String name, String price, String createAt) {
        setId(id);
        setName(name);
        this.price = price;
        this.createAt = createAt;
    }
}

Category类别:

public class Category extends BaseClass {
...

public Category(String id, String name, String createAt) {
    setId(id);
    setName(name);
    this.createAt = createAt;
}
}

并像这样比较:

Collections.sort("ArrayList<BaseClass>()", new Comparator<BaseClass>() {
        @Override
        public int compare(BaseClass baseClass, BaseClass t1) {
            return baseClass.getName().compareTo(t1.getName());
        }
    });

如果要按日期排序,请将date字段放入BaseClass

谢谢你的建议。 我找到了答案。 我只是在比较器内部的对象上进行类强制转换。

参见下面的代码,

Collections.sort(commonArrayList, new Comparator<Object>() {
                    @Override
                    public int compare(Object o1, Object o2) {
                        int res = 0;
                        if (o1 instanceof Category && o2 instanceof Category) {
                            res = (((Category) o1).getName().compareTo(((Category) o2).getName()));
                        } else if (o1 instanceof Product && o2 instanceof Product) {
                            res = (((Product) o1).getName().compareTo(((Product) o2).getName()));
                        } else if (o1 instanceof Category && o2 instanceof Product) {
                            res = (((Category) o1).getName().compareTo(((Product) o2).getName()));
                        } else if (o1 instanceof Product && o2 instanceof Category) {
                            res = (((Product) o1).getName().compareTo(((Category) o2).getName()));
                        }
                        return res;
                    }
                });

如果您有任何简化的想法,请在此处发布。

希望Java中的此示例解决方案可能有所帮助:

创建一个接口,让数据说如下

public interface Data {

}

创建模型类,如下所示:

产品

public class Product implements Data{
    String id;
    String name;
    String price;
    String createAt;

    public Product(String id, String name, String price, String createAt) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.createAt = createAt;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getCreateAt() {
        return createAt;
    }

    public void setCreateAt(String createAt) {
        this.createAt = createAt;
    }

}

类别

public class Category implements Data{
    String id;
    String name;
    String createAt;

    public Category(String id, String name, String createAt) {
        this.id = id;
        this.name = name;
        this.createAt = createAt;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCreateAt() {
        return createAt;
    }

    public void setCreateAt(String createAt) {
        this.createAt = createAt;
    }
    }

现在在该项目的主要班级

public class TestSorting {
    public static void main(String args[]) {
        ArrayList<Data> categories = new ArrayList<>();
        ArrayList<Data> products = new ArrayList<Data>();
        // For Product
        for (int i = 0; i < 10; i++) {
            Product product = new Product("Prod" + i, "Product " + i, "" + i, System.currentTimeMillis() + "");
            products.add(product);
        }
        // For category
        for (int i = 10; i >=0; i--) {
            Category category = new Category("Cat" + i, "Category " + i, System.currentTimeMillis() + "");
            categories.add(category);
        }
        Collections.sort(categories, new Comparator<Data>() {
            @Override
            public int compare(Data data, Data data2) {

                if(data instanceof Category)
                {
                     int result=(((Category) data).getId().compareTo((((Category) data2).getId())));


                     return result;


                }else if(data instanceof Product)
                {
                    int result= (((Product) data).getId().compareTo(((Product) data2).getId()));
                    return result;

                }else {
                    return 0;
                }

            }
        });

        System.out.println("******PRODUCT****************");
        // For Product
                for (int i = 0; i < products.size(); i++) {
                    Product product=((Product)products.get(i));
                    System.out.println(product.id+ "   "+product.name);
                }
                System.out.println("\n\n"+"******Caterogy****************");
                // For category
                for (int i = 0; i < categories.size(); i++) {
                    Category category=((Category)categories.get(i));
                    System.out.println(category.id+ "   "+category.name);
                }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM