是否有更好的方法来创建自定义列表,因为我的代码似乎是为了响应速度较慢的列表。我不能使用任何标准的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);
}
答案 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相比效率非常低的原因。