Android,在为Spinner设置适配器时口吃

时间:2012-09-06 00:17:07

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

我有一个listview,在里面,有几个listitems有微调器(其余的都有复选框)。问题是,每当我拨打spinner.setAdapter(ArrayAdapter);时,列表视图就会断断续续。如果我在getView()中注释掉那一行,那么listview可以很好地工作,你会问。使用该行,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的简单行为会导致listview滞后。这是我的整个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),那么listview非常流畅,有一堆无用的微调器。我之前在listviews中看过微调器。在滚动时,我该怎么做才能防止口吃?我考虑过使用适配器预设创建每个微调器,但我不知道如何将预先制作的微调器对象绑定到视图ID。

我对此有一些建议。

1 个答案:

答案 0 :(得分:0)

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