Android自定义列表速度慢

时间:2011-07-06 00:12:58

标签: java android

是否有更好的方法来创建自定义列表,因为我的代码似乎是为了响应速度较慢的列表。我不能使用任何标准的Android列表,因为我在ScrollView中需要两个ListView。

 setContentView(R.layout.alertsview);

    inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    topRows = new ArrayList<View>();
    topLayout = (LinearLayout)findViewById(R.id.topListLayout);
    topLayout.removeAllViews();
    topRows.clear();
    List<Camera> camList = new ArrayList<Camera>(SitesOrchestrator.getInstance().currentSite.cameraList);

    for (int i = 0; i < camList.size(); i++)
    {
        Camera cam = camList.get(i);
        View row = inflater.inflate(R.layout.cameraalertrow, null);
        TextView name = (TextView)row.findViewById(R.id.cameraNameAlerts);
        CheckBox chk = (CheckBox)row.findViewById(R.id.camAlertChk);
        name.setText(cam.name);
        chk.setChecked(cam.alertsEnabled);
        chk.setOnCheckedChangeListener(this);
        String index = Integer.toString(i);
        chk.setTag(index);
        topRows.add(row);
        topLayout.addView(row);
    }

1 个答案:

答案 0 :(得分:1)

如果你需要在相同的布局中列出,你应该创建自己的适配器(从基础适配器派生可能是好的),并且,假设你有两个arraylist:

ArrayList<TypeA> typeAList;
ArrayList<TypeB> typeBList;

@Override
int getViewTypeCount(){ return 2; } // means you have two different views from it

@Override
int getItemViewType(int position){
    if (position>typeAList.size()) return 1;
    return 0;
}

getView(int pos, View convertView, ViewGroup parent){
    // Check the pos
    if (getItemViewType(pos) == 0){
        // Inflate view and bind for type A
    }
    else{
        // Inflate view and bind for type B
    }
}

一般情况下,Android中不鼓励垂直放置两个列表视图,但将两个内容放在一个列表中就可以了。我也有一个tutorial,虽然它是在MVVM中用Android-Binding完成的。

此外,向ScrollView逐个添加视图以模仿ListView当然效率非常低。 Android ListView的工作方式(应该与桌面框架不同)是回收视图。假设您向上滚动,一旦孩子滚动到视线之外,列表视图将回收最顶层的一个并将其放在底部,并且可能回收的视图将在上面convertView中作为getView传递码。膨胀被认为是非常昂贵的过程,并且多个子视图也是内存消耗,这就是为什么您的代码与标准ListView相比效率非常低的原因。