首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android列表活动花费的时间太长,无法显示内容

Android列表活动花费的时间太长,无法显示内容
EN

Stack Overflow用户
提问于 2013-12-03 09:23:23
回答 3查看 769关注 0票数 1

我面临的问题是,一个列表活动需要太长的时间来加载。

我也知道延迟的原因,但不幸的是无法解决这个问题。

基本上,我有一个列表视图,它将显示孩子的列表,基本上是

对象显示以下属性(名称、年龄、性别)

代码语言:javascript
复制
Name : John Connor
Age  : 10 years, 2 months, 11days
Sex  : Male

为了将孩子的详细信息绑定到列表视图,我使用了一个绑定类,该类派生自

BaseAdapter。说KidDataBinder.在绑定类I的getView方法中

执行到TextView的文本绑定(基本上这个内容是list_row_item.xml的一部分)

布局)

当我想显示孩子们的详细信息时,问题就开始了,包括

他们的年龄(最新的日期)。

也就是说,如果我今天加载了孩子们的列表活动,条目应该是

代码语言:javascript
复制
Name : John Connor
Age  : 10 years, 2 months, 11days
Sex  : Male
---------------------------------
Name : Sandra Mueller
Age  : 11 years, 1 months, 2days
Sex  : Female
 .... so on 

如果我在一天后读到相同的列表活动,它应该会刷新年龄。

代码语言:javascript
复制
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年龄;字符串差异;尝试{

代码语言:javascript
复制
    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

EN

回答 3

Stack Overflow用户

发布于 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;

票数 2
EN

Stack Overflow用户

发布于 2013-12-03 09:59:50

您还可以从getview中提取计算年龄的逻辑,并在设置适配器之前计算它,这样每次调用getView时都不会花费这么长的时间。

您还可以编写适配器,如下所示。编辑适配器

代码语言:javascript
复制
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);


..
}
}

称之为:

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2013-12-03 09:50:05

您可以使用lazyloading.you来计算它们在getview之外的年龄,并将由名称、年份、月份、日期和性别组成的其他对象发送到适配器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20347208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档