1

リストビューがあり、その中にいくつかのリスト項目にスピナーがあります (残りにはチェックボックスがあります)。問題は、私が呼び出すたびspinner.setAdapter(ArrayAdapter);に、リストビューが途切れることです。getView() でその行をコメントアウトすると、リストビューはスムーズに機能します。その行では、新しいリストにヒットするたびにリストビューが途切れます。

これを助けるためにいくつかのことを試しました。最初は、 から文字列配列をプルする操作かもしれないと思った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;
    }

私は間違いなくリストビューの専門家ではないので、最初は getView であまりにも多くのロジックを実行していたのではないかと考えていました。ただし、単純に holder.spin.setAdapter(args) をコメントアウトすると、不要なスピナーがたくさんあるリストビューが完全にスムーズになります。以前にリストビューでスピナーを見たことがあります。スクロール中に途切れるのを防ぐにはどうすればよいですか? すべてのスピナーをアダプター プリセットで事前に作成することを考えましたが、事前に作成されたスピナー オブジェクトをビュー ID にバインドする方法がわかりません。

これについてアドバイスをいただければ幸いです。

4

1 に答える 1

0

多くのテストの後、android は、多くの短いアイテムよりもいくつかの長いアイテムを持つアダプターを設定するのがはるかに遅いことがわかりました。-12 から 36 までの数字のスピナーが 1 つあり、3 つのアイテムで合計 30 文字のスピナーよりもはるかに高速にロードされます (予想とは異なります)。項目ごとにより多くの文字を含む短いリストのボタンに移動するだけになりました。残念ながら、その理由を知りたい

于 2012-09-13T01:48:07.397 に答える