【问题标题】:Progressbar in RecyclerviewRecyclerview 中的进度条
【发布时间】:2016-04-16 16:21:46
【问题描述】:

我正在开发一个 android 项目,其中将有一个由项目(行)组成的 Recyclerview。在运行时,只要将 item(row) 添加到 Recyclerview,它就会开始上传到服务器并更新该 item(row) 中的进度条。这里的每个项目都是一个文件。只要将项目添加到屏幕大小,一切都会很好。每当项目超过屏幕限制时,我都需要滚动。滚动时,进度条在不同项目上更新。有时在两个或多个项目上。谷歌搜索了很多之后,我明白这是因为 Recyclerview 重用了已经创建的视图。

这是我的recyclerview的适配器代码:

    public class MyViewHolder extends RecyclerView.ViewHolder {

    private TextView filename;

    private ProgressBar file_progressbar;

    public MyViewHolder(View v) {

        super(v);

        filename = (TextView) v.findViewById(R.id.filename);

        file_progressbar = (ProgressBar) v.findViewById(R.id.file_progressbar);

    }

}


    public void onBindViewHolder(final MyViewHolder holder, final int position) {


    final String fname = fDataset.get((fDataset.size() - 1) - position);

    File f = new File(fname);

    holder.filename.setText(f.getName());
             if(internetchek.isNetworkAvailable(this.ctx))
             {

                 holder.file_progressbar.setVisibility(View.VISIBLE);

                 upload up = new upload(this.ctx,fname,holder.file_progressbar,"uploadstart");

                 up.execute();
             }
            else {

                 Toast.makeText(this.ctx, "Offline", Toast.LENGTH_LONG).show();

             }


        }

我已将 holder.file_progressbar 传递给上传类。以便进度条在 Upload 类中更新。我不知道如何解决这个问题。提前致谢

【问题讨论】:

    标签: android android-recyclerview android-progressbar


    【解决方案1】:

    尝试像这样为您的数据添加单独的标志

    private boolean isItemUpdating(int position) {
         return mDataUpdatingFlags[position];
    }
    
    private void setItemUpdating(int position, boolean isUpdating) {
         mDataUpdatingFlags[position] = isUpdating;
    }
    

    然后在您的onBindViewHolder 中调用这些方法来正确设置您的进度:

    if (isItemUpdating(position) {
        holder.showProgressBar();
    } else {
        holder.hideProgressBar();
    }
    

    【讨论】:

    • 它只解决了部分问题。每当一次上传超过屏幕大小的行时。一行的进度条显示另一行更新,反之亦然。
    • @sandesh,它实际上解决了这个问题。每当回收器的行数大到足以覆盖屏幕高度时,回收器将调用onBindViewHolder 将现有视图回收到指定位置的新项目。您可以发布您尝试过的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多