2016-12-15 163 views
0

我知道這可能是一個愚蠢的問題,但我找不到答案。 我問你的幫忙。爲什麼不工作notifyItemChanged

我有一個RecyclerView使用LinearLayoutManager和一個自定義的RecyclerView.Adapter。

我的數據類:

File folder = new File("My path"); 
    File[] files = folder.listFiles(); 
    int id = 0; 
    for (File file : files) { 
     if (!file.isDirectory()) { 
      Img img = new Img(); 
      img.setId(id); 
      img.setFilepath(file.toString()); 
      imgs.add(img); 
      ++id; 
     } 
    } 

    mAdapter = new GalleryAdapter(getApplicationContext(), imgs); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(), 2); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(mAdapter); 

和適配器:在活動

public class Img extends ArrayList<Img> { 
    int id = 0; 
    String filepath = ""; 
    boolean checked = false; 
    int progress = 0; 

    ... getters and setters... 
} 

代碼

@Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     Img item = imgs.get(position); 
     holder.txt.setText(String.valueOf(item.getProgress())); 
     holder.thumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       File source = new File(imgs.get(position).getFilepath()); 
       String strFileName = source.getName(); 
       File destination = new File("My path" + "/" + strFileName); 

       try { 
        InputStream input = null; 
        OutputStream output = null; 
        long lenghtOfFile = source.length(); 
        int count; 
        try { 
         input = new FileInputStream(source); 
         output = new FileOutputStream(destination); 
         byte[] data = new byte[1024]; 
         long total = 0; 
         int xc2 = 0; 
         while ((count = input.read(data)) != -1) { 
          total += count; 
          int xc = (int) ((total * 100)/lenghtOfFile); 

          output.write(data, 0, count); 
          imgs.get(position).setProgress(xc); 
          notifyItemChanged(position); 
          try { 
           Thread.sleep(20); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        } finally { 
        output.flush(); 
        output.close(); 
        input.close(); 
        } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

爲什麼notifyItemChanged(位置),在操作完成之後才觸發提交給TextView(txt)的值只有100?

UPD: 此代碼不能正常工作

@Override 
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
    final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_thumbnail, parent, false); 

    final MyViewHolder holder = new MyViewHolder(itemView); 

    itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final int position = holder.getAdapterPosition(); 
      if (position != RecyclerView.NO_POSITION) { 
       File source = new File(imgs.get(position).getFilepath()); 
       String strFileName = source.getName(); 
       File destination = new File("My path" + "/" + strFileName); 

       try { 
        InputStream input = null; 
        OutputStream output = null; 
        long lenghtOfFile = source.length(); 
        int count; 
        try { 
         input = new FileInputStream(source); 
         output = new FileOutputStream(destination); 
         byte[] data = new byte[1024]; 
         long total = 0; 
         int xc2 = 0; 
         while ((count = input.read(data)) != -1) { 
          total += count; 
          int xc = (int) ((total * 100)/lenghtOfFile); 
          output.write(data, 0, count); 
          if (xc2!=xc){ 
           //holder.progress_bar.setProgress(xc); 
           imgs.get(position).setProgress(xc); 
           notifyItemChanged(position); 
           try { 
            Thread.sleep(40); 
           } catch (InterruptedException e) { 
            e.printStackTrace(); 
           } 
          } 
          xc2 = xc; 
         } 
        } finally { 
         output.flush(); 
         output.close(); 
         input.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

    return holder; 
} 

UPD2: 此代碼不能正常工作

@Override 
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_thumbnail, parent, false); 

    final MyViewHolder holder = new MyViewHolder(itemView); 

    itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final int position = holder.getAdapterPosition(); 
      if (position != RecyclerView.NO_POSITION) { 
       for (int i=1; i<=100; ++i) { 
        imgs.get(position).setProgress(i); 
        notifyItemChanged(position); 
        try { 
         Thread.sleep(50); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }); 

    //return new MyViewHolder(itemView); 
    return holder; 
} 
+0

首先,刪除所有最終修飾符並將它們傳遞到視圖中的標記 –

+0

@OmarHossamEldin示例請 – SmallSani

回答

1

基本上傻冒傻冒做文件上的負載UI線程,所以每次調用notifyItemChanged()時,都會向Looper添加任務,但只有在完成加載後,Looper才能完成該任務只看到100

我會在不同的線程運行負荷,象這樣:

new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      File source = new File(imgs.get(position).getFilepath()); 
      String strFileName = source.getName(); 
      File destination = new File("My path" + "/" + strFileName); 
      **> Thread t1 = new Thread(new Runnable(){ 
      public void run(){ <** 
      try { 
       InputStream input = null; 
       OutputStream output = null; 
       long lenghtOfFile = source.length(); 
       int count; 
       try { 
        input = new FileInputStream(source); 
        output = new FileOutputStream(destination); 
        byte[] data = new byte[1024]; 
        long total = 0; 
        int xc2 = 0; 
        while ((count = input.read(data)) != -1) { 
         total += count; 
         int xc = (int) ((total * 100)/lenghtOfFile); 

         output.write(data, 0, count); 
         imgs.get(position).setProgress(xc); 
         notifyItemChanged(position); 
         try { 
          Thread.sleep(20); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } finally { 
       output.flush(); 
       output.close(); 
       input.close(); 
       } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    t1.start(); 
    } 
} 

那是我的猜想,祝你好運!