3

各行がテキスト ビューとプログレス バーで構成される ListView を利用する Android アプリに取り組んでいます。ユーザーが長いリストをスクロールする必要がない限り、物事はスムーズに機能します。

ProgressBars は、現在画面に表示されていない他の ProgressBars の進行状況を引き継ぎ始めます。

これは GetView の実装に起因する一般的な問題であることは理解していますが、ProgressBars を使用する最善の方法を考えています。

GetView:

public View getView(int position, View convertView, ViewGroup parent){

        View row = convertView;
        ViewWrapper wrapper;
        ProgressBar myProgressBar;
        int initProgress = myData.get(position).getProgress();

        if (row == null){
            LayoutInflater inflater = context.getLayoutInflater();
            row = inflater.inflate(R.layout.row, null); 

            wrapper = new ViewWrapper(row);
            row.setTag(wrapper);    
        }

        else{
            wrapper = (ViewWrapper)row.getTag();

        }

        RowModel model = getModel(position);        
        wrapper.getPid().setText(model.toString());
        myProgressBar = wrapper.getProgressBar();
        myProgressBar.setProgress(initProgress);
        myProgressBar.setMax(100);

        myProgressBar.setTag(new Integer(position));

        return row;
    }   

ビューラッパー:

public class ViewWrapper {
    View base;
    TextView pid = null;
    ProgressBar pb= null;

    ViewWrapper(View base){
        this.base = base;
    }

    TextView getPid(){
        if(pid == null){
            pid = (TextView)base.findViewById(R.id.pid);
        }

        return(pid);
    }

    ProgressBar getProgressBar(){
        if(pb== null){
            pb= (ProgressBar)base.findViewById(R.id.progressbar);
        }

        return(pb);
    }
}

この問題は次のことに関連しているようです。

myProgressBar = wrapper.getProgressBar();

その ProgressBar はリサイクルされた ProgressBar の動作を開始するためです。ただし、独自の動作が必要です。

これを軽減する最善の方法は何ですか?ありがとう。

4

2 に答える 2

0

渡された convertView を再利用せずに、毎回レイアウトを拡張する必要がある場合があります。大量の行がない限り、これは問題になりません。

于 2011-06-22T18:54:18.853 に答える
0

同様の機能を実装する必要がありました。これが私がしたことです。私は次の外部を実装しましたgetview

  • OnTouchListener - シークバー タッチ イベントをリッスンする
  • OnKeyListener - シークバーの dpad およびトラックボール イベントをリッスンする

これらのリスナーをシークバーに設定しましたgetView

リスナーが呼び出されるたびに、シークバーの親を見つけてfindviewbyid、親からテキストビューに移動します。

これで、更新する必要があるテキストビューとシークバーができました。私がする必要があるのは、配列からテキストを設定することだけでした。

ここに役立つコードがあります。

プライベート OnTouchListener touchListener = 新しい OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
            View parent = (View) v.getParent();
            TextView textView = (TextView) parent
                    .findViewById(R.id.id_grade_tooltip);
            if (textView == null) {
            } else {
                SeekBar seekBar = (SeekBar) v;
                textView.setText(String.valueOf(seekBar.getProgress())
                        + "%");
            }
            return false;
    }
};
于 2011-06-22T19:06:24.223 に答える