2013-02-04 30 views
6

Tôi có kịch bản, Trong ứng dụng trò chuyện của tôi, tôi muốn gửi ảnh, ảnh gửi cần có thời gian. Tôi đã đính kèm một thanh tiến trình (ngang) để hiển thị tiến trình gửi ảnh trong ứng dụng của tôi. Nhưng tôi không thể cập nhật thanh tiến trình vì nó là mục của chế độ xem danh sách tùy chỉnh.Cập nhật Thanh tiến trình trong chế độ xem danh sách

Đây là asynchtask của tôi để đặt tiến độ cho Thanh tiến trình nhưng tôi không thể nhận được.

class SendPhotoToFriend extends AsyncTask<String, String, String>{ 

     String receiver,path = ""; 

     public SendPhotoToFriend(String path,String receiver) { 
      // TODO Auto-generated constructor stub 

      this.path = path; 
      this.receiver = receiver; 

     } 


     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 

      ServiceDiscoveryManager sdm = ServiceDiscoveryManager 
      .getInstanceFor(connection); 

      if (sdm == null) 
       sdm = new ServiceDiscoveryManager(connection); 

      sdm.addFeature("http://jabber.org/protocol/disco#info"); 
      sdm.addFeature("jabber:iq:privacy"); 

      // Create the file transfer manager 
      FileTransferManager manager = new FileTransferManager(
        connection); 
      FileTransferNegotiator.setServiceEnabled(connection, true); 

      // Create the outgoing file transfer 
      OutgoingFileTransfer transfer = manager 
      .createOutgoingFileTransfer(receiver + "/Smack"); 

      System.out.println("Receiver of the file is "+receiver+"/smack"); 

      Log.i("transfere file", "outgoingfiletransfer is created"); 

      try { 
       long total = 0; 

       OutgoingFileTransfer.setResponseTimeout(30000); 
       transfer.sendFile(new File(path), "Description"); 
       Log.i("transfere file", "sending file"); 
       while (!transfer.isDone()) { 
        //Thread.sleep(1000); 

        total+=transfer.getProgress(); 

        publishProgress(""+(int)((total*100)/transfer.getFileSize())); 

        Log.i("transfere file", "sending file status " 
          + transfer.getStatus() + "progress: " 
          + transfer.getProgress()); 
        if (transfer.getStatus() == org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error) { 
         Log.i("transfere file", "Errorrr isss: " 
           + transfer.getError()+transfer.getPeer()); 
         transfer.cancel(); 
         break; 
        } 
       } 

      } catch (XMPPException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      Log.i("transfere file", "sending file done"); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final String... values) { 
      // TODO Auto-generated method stub 
      super.onProgressUpdate(values); 


      LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      final View view =inflater.inflate(R.layout.user_chat_send_chat, null); 
      ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); 
      p_Bar.setProgress(Integer.parseInt(values[0])); 

      customAdapter1.notifyDataSetChanged(); 



     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
     } 
    } 

Thanh tiến trình là chế độ xem của chế độ xem danh sách tùy chỉnh, tôi muốn cập nhật nó tại thời gian chạy.

Cảm ơn

Trả lời

7

Bạn đang tăng ProgressBar trong cuộc gọi lại onProgress. Điều này hoàn toàn sai. ProgressBar nên được thêm vào khung nhìn trước khi AsyncTask của bạn bắt đầu (thổi phồng và thêm) và sau đó biến nó thành visibile trong hàm tạo AsyncTask của bạn. Bạn cũng nên lưu trữ một tham chiếu đến ProgressBar trong AsyncTask (hoặc bằng cách nào đó khác trong phạm vi của lớp bên trong không tĩnh).

Trong cuối AsyncTask của bạn nên được nhìn như thế này (giả sử ProgressBar đã được gắn liền với quan điểm):

class SendPhotoToFriend extends AsyncTask<String, String, String> { 

    String receiver,path = ""; 

    ProgressBar progress; 

    public SendPhotoToFriend(String path, String receiver, ProgressBar progress) { 
     this.path = path; 
     this.receiver = receiver; 
     this.progress = progress; 
     this.progress.setVisibility(View.Visible); 
    } 


    @Override 
    protected String doInBackground(String... arg0) { 
     // You're application logic... 
     // ... 
     publishProgress((int)((total*100)/transfer.getFileSize())); 
     // ... 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 
     this.progress.setProgress(values[0]); 
    } 
} 

Ngoài ra bạn không cần phải (và không nên) gọi adapter.notifiyDataSetChanged() tại của bạn onProgres-Callback.

+0

Tôi có nên gọi nó từ phương thức getView không? –

+0

Quyết định này phụ thuộc rất nhiều vào kiến ​​trúc phần mềm của ứng dụng của bạn. Không có sai hay đúng. Nó giống như nơi mà nó có ý nghĩa hơn để gọi AsyncTask của bạn .. Tôi sợ tôi không thể trả lời câu hỏi này cho bạn. – Taig

+0

Ok cảm ơn. Tôi sẽ kiểm tra nó và sẽ trở lại với bạn –

0

Tôi cho rằng mỗi xem danh sách mục có một thanh tiến trình, nếu đó là trường hợp, bạn có thể sử dụng getView để có được quan điểm cho vị trí đó, và sau đó gọi:

 View view = customAdapter1.getView(position, convertView, parent); 
     ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); 
     p_Bar.setProgress(Integer.parseInt(values[0])); 

Không cần phải gọi customAdapter1. notifyDataSetChanged();

Các vấn đề liên quan