如何在android中绑定对象(数据)和ViewHolder(listview行)?

时间:2010-11-17 11:14:37

标签: android listview

我需要一些帮助,执行休假任务。任何人都可以帮忙解决这个问题吗?

我有列表视图。每行包含

  1. 标题(Textview)
  2. 子标题(TextView)
  3. 进度条
  4. 进度计数(TextView)
  5. 下载/取消(ToggleButton)
  6. 加载适配器我通过List。从哪里显示标题,每行的副标题。

    这是myadapter代码,为每一行生成视图。

    我的问题是。在运行时,当我输入下载按钮时,它将进入downloadQueue进行下载,并更新相应的进度条。但是Whwn正在滚动列表视图。进度条可见其他行而不是我开始下载的当前行。有人可以告诉我,如何绑定视图和状态对象,以便它不会错误地放置进度条。

    `

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final int pos= position;
            final StateViewHolder viewHolder;
            final State state = stateList.get(pos) ;
            if (convertView == null) {
                 inflater = LayoutInflater.from(context);
                convertView = inflater.inflate(R.layout.adapter_view, null);
                TextView title = (TextView) convertView.findViewById(R.id.text);
                TextView subTitle = (TextView) convertView.findViewById(R.id.subText);
                TextView progresstext = (TextView) convertView.findViewById(R.id.progressText);
                ProgressBar progressBar = (ProgressBar) convertView.findViewById(R.id.progress);
                ImageView cancel = (ImageView) convertView.findViewById(R.id.cancel);
                ImageView download = (ImageView) convertView.findViewById(R.id.download);
                 viewHolder = new StateViewHolder(title, subTitle, progresstext, download, cancel, progressBar);
                 hashMap.put(state, viewHolder);
                 convertView.setTag(viewHolder);
                 Log.i("DownloadAdapter", "InGetView");
            }else{
                viewHolder = (StateViewHolder)convertView.getTag();
            }
             state.setViewHolder(viewHolder);
            viewHolder.getDownload().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                         viewHolder.getDownload().setVisibility(View.GONE);
                         viewHolder.getCancel().setVisibility(View.VISIBLE);
                         Log.i("DownloadAdapter", ""+state.getName());
                        DownloadQueue.addToQueue(state);
                    }
                });
             viewHolder.getCancel().setOnClickListener(new View.OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                         viewHolder.getCancel().setVisibility(View.GONE);
                         viewHolder.getDownload().setVisibility(View.VISIBLE);
                        DownloadQueue.RemoveFromQueue(state);
                    }
                });
    
            viewHolder.getTitle().setText(state.getName());
            viewHolder.getSubTitle().setText(state.getEffective());
            return convertView;
        }
    }
    

    感谢你, SRINIVAS

    `

1 个答案:

答案 0 :(得分:0)

当您使用视图持有者重用行视图时,您需要每次都显式设置所有视图。换句话说,您需要设置该行中的每个元素,包括标题,字幕,进度计数文本视图,进度条和下载图像视图切换。

您看到的是当一行将进度条设置为可见时,另一行可能正在重复使用(因此您也会在该行上看到进度条)。因此,您需要明确将进度条设置为对于未下载的行不可见。

因此,在getView方法的底部,请确保您具有设置每个视图的逻辑:

viewHolder.getTitle().setText(state.getName());
viewHolder.getSubTitle().setText(state.getEffective());
viewHolder.getProgressBar().setVisibility(isImageDownloading);
viewHolder.getProgressCount().setText("example");