我有一个列表视图,里面有几个列表项有微调器(其余的有复选框)。问题是,每次我打电话spinner.setAdapter(ArrayAdapter);
时,列表视图都会结结巴巴。如果我在 getView() 中注释掉该行,则列表视图效果很好,如您所问的那样流畅。使用该行,listview 每次遇到新列表时都会卡顿。
我已经尝试了一些方法来帮助解决这个问题。起初,我认为这可能是从 中提取字符串数组的操作R.array.somestringarray
,因此我将这些字符串数组加载到另一个数组中,以便在需要它们之前将它们放在内存中。那没有用。然后我假设这是适配器的实际创建,因为我当时的代码看起来像
ArrayAdapter<String> spinAdapter = new ArrayAdapter<String>(ScoreCounter.this,android.R.layout.simple_spinner_dropdown_item, forAdapter);
holder.spin.setAdapter(spinAdapter);
所以我事先创建了所有创建的所有 ArrayAdapters 并将它们放在一个数组中,所以我的代码如下所示:
holder.spin.setAdapter(masterSpinAdapter[position]);
那还是结巴。似乎设置 ArrayAdapter 的简单行为会导致列表视图滞后。这是我的整个 getView():
@Override
public View getView(int position, View convertView, ViewGroup parent){
if(convertView==null){
LayoutInflater inflator = ScoreCounter.this.getLayoutInflater();
convertView = inflator.inflate(R.layout.spinner_item , parent, false);
ViewHolder holder = new ViewHolder();
holder.cbox = (CheckBox)convertView.findViewById(R.id.scoreCheck);
holder.spin = (Spinner)convertView.findViewById(R.id.scoreSpinner);
holder.missionTitle = (TextView)convertView.findViewById(R.id.missionTitle);
holder.missionDescription = (TextView) convertView.findViewById(R.id.missionDescription);
holder.checkListen = new checkListener();
holder.itemListen = new itemListener();
convertView.setTag(holder);
}
ViewHolder holder = (ViewHolder)convertView.getTag();
if(position==1||position==2||position==5||position==6||position==13||position==15){
holder.spin.setVisibility(0x00000004);
holder.spin.setEnabled(false);
holder.cbox.setVisibility(0);
holder.cbox.setEnabled(true);
holder.cbox.setChecked(shouldBeChecked[position]);
holder.checkListen.setRow(position);
holder.cbox.setOnClickListener(holder.checkListen);
}else{
holder.spin.setVisibility(0);
holder.spin.setEnabled(true);
holder.cbox.setVisibility(0x00000004);
holder.cbox.setEnabled(false);
holder.spin.setAdapter((ArrayAdapter)masterSpinAdapter[position]);
holder.itemListen.setRosPos(position);
holder.spin.setOnItemSelectedListener(holder.itemListen);
holder.spin.setSelection(spinnerPosition[position]);
}
holder.missionTitle.setText(missions[position]);
holder.missionDescription.setText(descriptions[position]);
return convertView;
}
我绝对不是listviews方面的专家,所以我原本以为我可能在getView中做了太多的逻辑。但是,如果我简单地注释掉 holder.spin.setAdapter(args),列表视图会非常平滑,并带有一堆无用的微调器。我以前在列表视图中看到过微调器。我可以做些什么来防止滚动时出现口吃?我考虑过使用适配器预设预先创建每个微调器,但我不知道如何将预制微调器对象绑定到视图 ID。
我想对此提出一些建议。