Android列表活动花费太长时间来显示内容

Android列表活动花费太长时间来显示内容,android,performance,listactivity,baseadapter,Android,Performance,Listactivity,Baseadapter,我面临的问题是listactivity加载时间过长 我也知道延迟的原因,但不幸的是无法修复此故障 基本上我有一个listview,它将显示孩子的列表,基本上是一个 显示以下属性的person对象(姓名、年龄、性别) Name : John Connor Age : 10 years, 2 months, 11days Sex : Male 为了将kid细节绑定到listview,我使用了一个binder类,该类派生自 基本适配器。说KidDataBinder。在活页夹类I的getView方

我面临的问题是listactivity加载时间过长

我也知道延迟的原因,但不幸的是无法修复此故障

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

显示以下属性的person对象(姓名、年龄、性别)

Name : John Connor
Age  : 10 years, 2 months, 11days
Sex  : Male
为了将kid细节绑定到listview,我使用了一个binder类,该类派生自

基本适配器。说KidDataBinder。在活页夹类I的getView方法中

执行文本绑定到TextView(基本上,此内容是一个部件列表\u row\u item.xml

布局图)

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

他们的年龄(最晚为当前日期)

i、 如果我今天加载儿童列表活动,条目应为

Name : John Connor
Age  : 10 years, 2 months, 11days
Sex  : Male
---------------------------------
Name : Sandra Mueller
Age  : 11 years, 1 months, 2days
Sex  : Female
 .... so on 
如果我一天后读到同样的listactivity,它应该会刷新年龄

Name : John Connor
Age  : 10 years, 2 months, 12days
Sex  : Male
---------------------------------
Name : Sandra Mueller
Age  : 11 years, 1 months, 3days
Sex  : Female
 .... so on 
注意:注意年龄段天数的变化

为了实现这一点,我有一个实用的方法,基本上可以得到孩子的出生日期

并计算出他最近的年龄

/* *返回年龄 *年、月、日格式 * */ 私有字符串计算(字符串strdob){ 智力年龄; 弦差; 试一试{

}

因此,这个方法帮助我获取孩子的最新年龄,但性能影响不大

非常巨大。最初,如果加载孩子列表所用的时间10毫秒,则在

包括计算最新年龄的逻辑,延迟几乎3500ms

这里发生的是每次getView获取当前Kid对象时 它必须访问出生日期(dob)字段--->调用通过dob的calculateAge--->获取最新年龄-->最后设置属于年龄的textview项目

有没有一种方法可以在单独的数据库上的BaseAdapter类内部执行此计算部分

线程或其他东西,使延迟最小化

感谢您的投入/回复


VATSAG

您可以使用lazyloading。您可以在getview之外计算它们的年龄,并将包含名称、年、月、日和性别的其他对象发送给适配器。

您需要检查日期计算的逻辑。您可以检查。它要求您包括一些实用程序类。或者您可以替换计算逻辑使用以下代码


您还可以将计算年龄的逻辑带出getview,并在设置适配器之前进行计算,这样每次调用getview时都不会花费这么长的时间

您还可以按如下方式编写适配器。 编辑 适配器

公共类MyAdapter扩展了适配器{
ArrayList儿童;
ArrayList时代
公共myAdapter(上下文、ArrayList子项、ArrayList年龄){
这个。孩子=孩子;
这个。年龄=年龄;
}
公共视图getView(……){
...
个人孩子=孩子。获取(位置);
字符串年龄=年龄.get(位置);
..
}
}
称之为:

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);
ArrayList kids=new ArrayList();
添加(…)
添加(…)
添加(…)
String[]ages=新字符串[kids.size()];
int i=0;
个人(儿童:儿童){
ages[i++]=calculateAge(kid.getDOB());
}
MyAdapter=新的MyAdapter(这个、孩子、年龄);

我认为计算年龄的复杂性太大了,你需要其他方法(逻辑)来计算年龄。这里是n^2,它需要是n或nlogn。但是d.o.b内容只有在特定项目位置的getview方法中才知道。因此,根据d.o.b内容,我必须详细计算年龄。如果您无法编辑模型类,您可以迭代person list并生成单独的年龄列表,然后将该列表传递给ad还有一点。我不认为该方法本身需要花费那么长的时间来执行。它是列表中每个导致问题的项反复执行该方法所花费的总时间。实际上,我尝试了实现该逻辑,延迟减少了一点>:)现在相同的操作需要1500毫秒左右。肯定是一个改进。我将尝试实施其他人的建议,并将相应地标记为答案
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;
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);