我有以下问题,但我不确定如何解决.我从几个不同的服务器请求数据,每个服务器返回一个不同类型的对象列表(每个服务器都有它自己特定的唯一POJO对象类型)-但是所有这些对象列表的共同点是,所有对象都有一个日期参数.然后,我需要将所有列表中的对象显示为一个巨大的混合列表供用户使用,所有各种对象均按日期排序.
我制作了一个扩展baseadapter的适配器,并将所有对象的数组列表传递给了该适配器-但是如何按日期对所有这些对象列表进行排序并一起显示呢?我可以创建一个具有所有其他对象属性的“超级对象”,然后对该超级对象进行排序后的数组传递给适配器,但这似乎是一个混乱且粗糙的解决方案.有某种或多或少的优雅方法可以做到这一点吗?
public class someAdapter extends BaseAdapter
{
...
public someAdapter(ArrayList<ObjectOne> objectOneArray, ArrayList<ObjectTwo> objectTwoArray) {
if (objectOneArray != null) {
this.localObjectOneList.addAll(objectOneArray);
}
...
}
}
对象类型的示例:
public class ObjectOne implements Serializable {
private String date;
private String someFieldOne;
private String someFieldTwo;
...
//getters and setters
...
}
重申一下-最终列表必须按照日期的顺序混合所有不同的对象类型.
解决方法:
如果没有庞大的管道,您最初期望的拥有超类的方式会很好.
更好的方法如下:假定所有POJO都有getDate()方法.
>声明方法getDate()从任何POJO中检索日期对象.
>声明比较器以比较日期
>排序对象
如果POJO没有吸气剂,即getDate()方法,则在比较器中将getDateFromMethod()替换为getDateFromProperty().
public class Sorter{ public void sortList()
{
Collections.sort(objList, comparator);
// Now consume / print your objList to get sorted by date
}
ArrayList<Object> objList = new ArrayList<Object>();
Comparator<Object> comparator = new Comparator<Object>()
{
@Override
public int compare(Object object1, Object o2)
{
Date o1Date = getDateFromMethod(object1);
Date o2Date = getDateFromMethod(o2);
if (o1Date != null && o2Date != null)
{
if (o1Date.before(o2Date))
return -1;
else if (o1Date.after(o2Date))
return 1;
else
return 0;
}
else
return -1;
}
};
public Date getDateFromMethod(Object obj)
{
Date date = null;
String getDate = "getDate";
try
{
Method method = obj.getClass().getMethod(getDate, (Class<?>[]) null);
if (method != null)
date = (Date) method.invoke(obj, (Object[]) null);
}
catch (NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SecurityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}public Date getDateFromProperty(Object obj)
{
Date date=null;
try
{
Field dateField= obj.getClass().getField("date");
if(dateField!=null)
date=(Date) dateField.get(obj);
}
catch (NoSuchFieldException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SecurityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
}
现在说,例如,您具有如下的Obj1,Obj2和Obj3,使用这些POJOS创建对象并填充objList并测试解决方案.
Obj1类
{
int id;
整数名称
日期date;
public Date getDate()
{
归期;
}
公共诠释getId()
{
返回ID;
}
public void setId(int id)
{
this.id = id;
}
public int getName()
{
return name;
}
public void setName(int name)
{
this.name = name;
}
}
Obj2类
{
整数序列;
int位置;
日期date;
public Date getDate()
{
归期;
}
public int getSequence()
{
返回顺序;
}
public void setSequence(int sequence)
{
this.sequence = sequence;
}
public int getLocation()
{
return location;
}
public void setLocation(int location)
{
this.location = location;
}
}
Obj3类
{
整型
int来源;
日期date;
public Date getDate()
{
归期;
}
public void setDate(日期)
{
this.date =日期;
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public int getOrigin()
{
return origin;
}
public void setOrigin(int origin)
{
this.origin = origin;
}
}