【问题标题】:Android, stutters when setting adapter for SpinnerAndroid,为 Spinner 设置适配器时出现口吃
【发布时间】:2012-09-13 09:48:07
【问题描述】:

我有一个列表视图,其中有几个列表项有微调器(其余的有复选框)。问题是,每次我打电话给spinner.setAdapter(ArrayAdapter);,listview 都会卡顿。如果我在 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);

所以我事先创建了所有已创建的 ArrayAdapter 并将它们放入一个数组中,因此我的代码如下所示:

    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。

我很想对此提出一些建议。

【问题讨论】:

    标签: android android-listview android-arrayadapter android-spinner


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2016-11-14
      • 2015-06-07
      相关资源
      最近更新 更多