1

我有一个列表视图,里面有几个列表项有微调器(其余的有复选框)。问题是,每次我打电话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。

我想对此提出一些建议。

4

1 回答 1

0

经过大量测试,我发现 android 设置具有一些长项的适配器比设置很多短项要慢得多。我有一个数字 -12 到 36 的微调器,它的加载速度比 3 个项目中总共 30 个字符的微调器快得多(不是我预期的)。我最终只是移动到每个项目有更多字符的短列表的按钮。不幸的是,我希望我知道为什么

于 2012-09-13T01:48:07.397 回答