向下滚动时列表视图错误

时间:2013-05-13 04:53:48

标签: android android-listview

我在listview中有按钮和进度条(不可见)。当按钮单击时,它应该消失并且进度条应该可见并开始运行(从Web服务器下载),并且当完成运行按钮时应该再次出现。现在,当我单击第一个项目的按钮时,进度条会运行,但如果我向下滚动直到第一个项目离开屏幕,我会看到进度条与列表视图的最后一项上的第一个项目的进度条同时运行。如果我向上滚动第一个项目的进度条正常运行。如果我单击第二个项目列表视图的倒数第二个项目相同,则会发生相同的情况。有什么问题,怎么解决?请帮忙!!!

4 个答案:

答案 0 :(得分:0)

您必须记住正在下载的位置,它们的进度(如果您没有显示无限期栏),并在适配器的getView中更新这些值。这实际上很快变得非常复杂 - 如果你想在下载完成后再次更新视图,你必须做很多非常仔细的编码,看看listview的工作方式和回收视图的方式,或者你必须更新整个listview在文件完成下载或更新进度时,这可能会导致闪烁。

答案 1 :(得分:0)

选择viewHolder类的概念,该类保存listview的状态,直到该过程完成。 Urs的主要问题是当你滚动列表视图时,视图获取刷新子只有它才会进入初始状态。

Class ViewHolder
{
TextView mtext;
Button mButton;
ProgressBar mBar;
}

在getview方法中 初始化视图类

链接:

http://developer.android.com/training/improving-layouts/smooth-scrolling.html http://developer.android.com/training/contacts-provider/display-contact-badge.html

答案 2 :(得分:0)

尝试这样的事情......我正在使用不同的视图进行pdf下载,但你可以使用这个概念

    Holder holder;
    class Holder {
        TextView txt_pdfname;
        Button btn_download;
        ImageView img_pdficon;
    }

    @Override
    public View getView(final int arg0, View arg1, ViewGroup arg2) {


        // position=arg0;
        View v=arg1;
        if (v == null) {
             holder = new Holder();
            v = layoutInflater.inflate(R.layout.cell_document, arg2,false);
            holder.txt_pdfname = (TextView) v.findViewById(R.id.txt_pdfname);
            holder.img_pdficon=(ImageView)v.findViewById(R.id.img_pdficon);
            holder.btn_download = (Button) v.findViewById(R.id.btn_download);
            v.setTag(holder);

        } else{
            holder = (Holder) v.getTag();

        }
        File pdfFile=new File(Environment.getExternalStorageDirectory().toString()+"/fpapdf/"+(pdfUrl[arg0].substring(pdfUrl[arg0].lastIndexOf('/')+1)));
        if(pdfFile.exists()){
            holder.btn_download.setVisibility(View.INVISIBLE);

        }else
            holder.btn_download.setVisibility(View.VISIBLE);
        holder.txt_pdfname.setText(this.pdfArray[arg0]);
        holder.img_pdficon.setImageResource(pdfImage[arg0]);

        holder.btn_download.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // YOUR CODE HERE

            }

        });

        return v;
    }

有关详细信息,请参阅this by Romain

答案 3 :(得分:0)

用这个替换你的getView,我删除了if(view == null),你每次都会得到一个新的视图而不是标签

@Override
public View getView(final int position, View convertView, ViewGroup parent) {   
final ArrayList<String> array=JournalArray.get(position);
final ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();

    view = new ViewHolder();
    convertView = inflator.inflate(R.layout.familylist_item, null);
    view.progress=(ProgressBar)convertView.findViewById(R.id.downprogress);
    view.txtViewTitle = (TextView) convertView.findViewById(R.id.text);
    view.imgViewFlag = (ImageView) convertView.findViewById(R.id.imageView1);
    view.imgAR=(Button)convertView.findViewById(R.id.imageAR);
    view.imgAR.setTag(view);
    view.imgDown=(Button)convertView.findViewById(R.id.imageDown);
    view.imgDown.setTag(view);
    view.imgPDF=(Button)convertView.findViewById(R.id.imagePDF);
    view.imgPDF.setTag(view);
    view.progress=(ProgressBar)convertView.findViewById(R.id.downprogress);
    view.btnDel=(Button)convertView.findViewById(R.id.btnDel);
    view.btnDel.setTag(view);
    convertView.setTag(view);
}