我面临的问题是列表活动需要很长时间才能加载。
我也知道这种延迟背后的原因,但遗憾的是无法解决这个问题。
基本上我有一个列表视图,它会显示基本上是
的孩子列表人物对象显示以下属性 (姓名,年龄,性别) 。
Name : John Connor
Age : 10 years, 2 months, 11days
Sex : Male
为了将kid细节绑定到listview,我使用了一个派生自
的binder类BaseAdapter。说 KidDataBinder 。在binder类的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
注意 :注意年龄中天数的变化
为了达到这个目的,我有一个实用方法,基本上可以得到孩子的出生日期
并计算他的最新年龄。
/ * *返回年龄 *年月日格式 * * / private String calculateAge(String strdob){ 年龄; 字符串差异; 尝试{
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;
}
因此,这种方法可以帮助我获取孩子的最新年龄但是性能受到了影响
非常棒。最初,如果加载孩子列表所花费的时间 10ms 。之后
包括计算最新年龄的逻辑,延迟几乎 3500ms !!!这里发生的事情是每次getView获取当前的Kid对象 它必须访问出生日期(dob)字段--->调用calculateAge传递dob --->获得最新年龄 - >最后设置属于 AGE
的textview项目有没有办法在单独的
中在BaseAdapter类中执行此计算部分线程或其他东西,以便最小化此延迟。
感谢您的输入/回复
VATSAG
答案 0 :(得分:2)
您需要查看日期计算的逻辑。您可以查看this。它要求您包含一些实用程序类。或者使用以下代码替换计算逻辑
GregorianCalendar d1 = new GregorianCalendar(1992, 8 - 1, 17); GregorianCalendar d2 = new 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;
答案 1 :(得分:1)
你也可以从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);
答案 2 :(得分:0)
你可以使用lazyloading.you可以在getview之外计算他们的年龄,并向你的适配器发送由名字,年,月,日和性别组成的其他对象。