Android列表活动需要很长时间才能显示内容

时间:2013-12-03 09:23:23

标签: android performance listactivity baseadapter

我面临的问题是列表活动需要很长时间才能加载。

我也知道这种延迟背后的原因,但遗憾的是无法解决这个问题。

基本上我有一个列表视图,它会显示基本上是

的孩子列表

人物对象显示以下属性 (姓名,年龄,性别)

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

3 个答案:

答案 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之外计算他们的年龄,并向你的适配器发送由名字,年,月,日和性别组成的其他对象。