浏览进度条的ListView

3

我正在开发一款利用ListView的Android应用程序,其中每行都由一个文本视图和一个进度条组成。当用户必须滚动长列表时,事情会顺利进行。

除非用户需要滚动长列表,否则ProgressBar会开始承担当前屏幕上不可见的其他ProgressBar的进度。

我知道这是一个常见的问题,源于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;
    }   

ViewWrapper:

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();

由于进度条开始具有已回收进度条的行为,因此我希望它具有自己的行为。

有什么最好的方法来缓解这种情况吗?谢谢。

2个回答

0

我不得不实现一个类似的功能,这是我的做法。我在getview之外实现了以下内容:

  • OnTouchListener - 监听seekbar触摸事件
  • OnKeyListener - 监听dpad和trakball事件以获取seekbar

我为seekbars设置了这些监听器从getView中。

每当监听器被调用时,我会找到seekbar的父级,然后从父级到文本视图执行findviewbyid

现在我有了要更新的文本视图和seekbar。我所需要做的就是从数组中设置文本。

这里有一些代码可以帮助你。

private OnTouchListener touchListener = new 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;
    }
};

0

每次可能需要膨胀布局而不是重复使用传入的convertView。除非您有很多行,否则这不应该成为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接