我面临的问题是,一个列表活动需要太长的时间来加载。
我也知道延迟的原因,但不幸的是无法解决这个问题。
基本上,我有一个列表视图,它将显示孩子的列表,基本上是
对象显示以下属性(名称、年龄、性别)。
Name : John Connor
Age : 10 years, 2 months, 11days
Sex : Male为了将孩子的详细信息绑定到列表视图,我使用了一个绑定类,该类派生自
BaseAdapter。说KidDataBinder.在绑定类I的getView方法中
执行到TextView的文本绑定(基本上这个内容是list_row_item.xml的一部分)
布局)
当我想显示孩子们的详细信息时,问题就开始了,包括
他们的年龄(最新的日期)。
也就是说,如果我今天加载了孩子们的列表活动,条目应该是
Name : John Connor
Age : 10 years, 2 months, 11days
Sex : Male
---------------------------------
Name : Sandra Mueller
Age : 11 years, 1 months, 2days
Sex : Female
.... so on 如果我在一天后读到相同的列表活动,它应该会刷新年龄。
Name : John Connor
Age : 10 years, 2 months, 12days
Sex : Male
---------------------------------
Name : Sandra Mueller
Age : 11 years, 1 months, 3days
Sex : Female
.... so on 备注:注意时代的变化
要做到这一点,我有一个实用的方法,它基本上得到了孩子的出生日期
计算他的最新年龄。
/* *以*年、月和日格式* */私有字符串calculateAge( strdob) { int年龄;字符串差异;尝试{
SimpleDateFormat custDateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date dob = custDateFormat.parse(strdob);
Calendar today = Calendar.getInstance();
Calendar cd = Calendar.getInstance();
cd.setTime(dob);
int dateParts[] = {Calendar.MONTH,Calendar.DAY_OF_MONTH,Calendar.YEAR};
int diff[] = new int[3];
for(int i = 2; i >= 0; i--)
{
while(!custDateFormat.format(cd.getTime()).split("/")[i].equals(custDateFormat.format(today.getTime()).split("/")[i]))
{
cd.add(dateParts[i],1);
diff[i]++;
}
}
difference = ""+(diff[2]+" yrs : "+diff[0])+" months : "+diff[1]+" days";
}
catch(ParseException pex){
return "--";
}
catch(IllegalArgumentException iex){
return "--";
}
return difference;}
因此,这个方法帮助我获取孩子的最新年龄,但是性能的影响是
相当巨大。最初,如果加载孩子列表所花费的时间是,10 if,。之后
包括计算最新年龄的逻辑,延迟时间几乎是3500 is !
这里发生的是,每次getView获得当前的Kid对象时,它必须访问生日字段(道布)字段->调用传递道布的calculateAge -->获取最新的年龄-->最后设置属于 age 的文本视图项
是否有方法在单独的BaseAdapter类中执行此计算部分?
线程或其他东西,以使延迟最小化。
感谢您的投入/回应。
VATSAG
发布于 2013-12-03 09:50:14
您需要检查日期计算的逻辑。你可以检查一下this。它要求您包括一些实用程序类。或者用以下代码替换计算逻辑
GregorianCalendar d1 =新GregorianCalendar(1992,8-1,17);GregorianCalendar d2 =新GregorianCalendar(2013,6-1,18);d2.add(Calendar.YEAR,-d1.get(Calendar.YEAR));d2.add(Calendar.MONTH,-d1.get(Calendar.MONTH));d2.add(Calendar.DAY_OF_MONTH,-d1.get(Calendar.DAY_OF_MONTH) + 1);int y= d2.get(Calendar.YEAR);int m= d2.get(Calendar.MONTH);int d= d2.get(Calendar.DAY_OF_MONTH) - 1;
发布于 2013-12-03 09:59:50
您还可以从getview中提取计算年龄的逻辑,并在设置适配器之前计算它,这样每次调用getView时都不会花费这么长的时间。
您还可以编写适配器,如下所示。编辑适配器
public class MyAdapter extends Adapter{
ArrayList<Person> kids;
ArrayList<String> ages
public myAdapter(Context context,ArrayList<Person> kids,ArrayList<String> ages){
this.kids=kids;
this.ages=ages;
}
public View getView(......){
...
Person kid=kids.get(position);
String age=ages.get(position);
..
}
}称之为:
ArrayList<Person> kids=new ArrayList<Person>();
kids.add(..)
kids.add(..)
kids.add(..)
String[] ages=new String[kids.size()];
int i=0;
for(Person kid:kids){
ages[i++]=calculateAge(kid.getDOB());
}
MyAdapter adapter=new MyAdapter(this,kids,ages);发布于 2013-12-03 09:50:05
您可以使用lazyloading.you来计算它们在getview之外的年龄,并将由名称、年份、月份、日期和性别组成的其他对象发送到适配器。
https://stackoverflow.com/questions/20347208
复制相似问题