2015-10-08 31 views
1

我想顯示progressBar在Adapter for ListView中下載圖像。當圖像下載時,progressBar不會消失,圖像不會顯示。當我上下滾動時,它完美地工作。我不知道該怎麼做。對不起我的英語不好。爲了更好的理解,我放了截圖。帶適配器的畢加索

下面是來自適配器的方法:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder =null; 


     if(convertView==null){ 

      viewHolder = new ViewHolder(); 
      convertView = layoutInflater.inflate(R.layout.programs_item, null); 
      viewHolder.programName = (TextView) convertView.findViewById(R.id.programName); 
      viewHolder.programDuration = (TextView) convertView.findViewById(R.id.programDuration); 
      viewHolder.programImg = (ImageView) convertView.findViewById(R.id.programImg); 
      viewHolder.programImgLoading = (ProgressBar) convertView.findViewById(R.id.programImgLoading); 
      convertView.setTag(viewHolder); 

     } 
     else 
     { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     String name = getItem(position).getName(); 
     Log.d("NAMELOG", "" + getItem(position).getName()); 
     long duration1 = (getItem(position).getDuration()); 
     long duration = TimeUnit.SECONDS.toMinutes(duration1); 
     Log.d("TIMEEEE",""+duration+" "+duration1); 
     String duration2 = String.valueOf(duration)+ " min"; 
     viewHolder.programName.setText(name); 
     viewHolder.programDuration.setText(duration2); 

     File dir = new File(FILE_PATH); 

     File imgFile = new File(dir, getItemId(position) + ".png"); 

     if(imgFile.exists()){ 

      Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

      viewHolder.setImg(myBitmap); 


     } 
     else if (isNetworkConnected()) { 

      Log.d("MYLOGGGGGGGG", MYurl.BASE_URL + "/" + String.valueOf(getItem(position).getImgLarge()) + ""); 
      final ViewHolder finalViewHolder = viewHolder; 
      Picasso.with(mContext) 
        .load(MYurl.BASE_URL + "/" + getItem(position).getImgMedium()) 
        .into(new Target() { 
         @Override 
         public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 

          finalViewHolder.programImgLoading.setVisibility(View.INVISIBLE); 
          finalViewHolder.setImg(bitmap); 


          File dir = new File(FILE_PATH); 
          if (!dir.exists()) 
           dir.mkdirs(); 
          File file = new File(dir, getItemId(position) + ".png"); 
          FileOutputStream fOut = null; 
          try { 
           Log.d("MYLOGSFILE", FILE_PATH + " " + file.getName()); 
           fOut = new FileOutputStream(file); 
          } catch (FileNotFoundException e) { 
           e.printStackTrace(); 
          } 

          bitmap.compress(Bitmap.CompressFormat.PNG, 80, fOut); 
          try { 
           fOut.flush(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          try { 
           fOut.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 



         } 


         @Override 
         public void onBitmapFailed(Drawable errorDrawable) { 
          finalViewHolder.programImg.setImageResource(R.drawable.noimage); 
         } 

         @Override 
         public void onPrepareLoad(Drawable placeHolderDrawable) { 
          finalViewHolder.programImg.setImageBitmap(null); 
          finalViewHolder.programImgLoading.setVisibility(View.VISIBLE); 
         } 
        }); 

     } 
     else{ 

      viewHolder.programImg.setImageResource(R.drawable.noimage); 




     } 


     return convertView; 
    } 

before scrolling

+0

在你的onBitmapLoaded(位圖位圖,Picasso.LoadedFrom from)方法中試試這個:finalViewHolder.programImgLoading.setVisibility(View.GONE); – KERiii

+0

這不是幫助 – Roman

+0

像onBitmapLoaded不起作用。 – Roman

回答

0

對不起,你想在你adpter做什麼?

if(imgFile.exists()){ 

     Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

     viewHolder.setImg(myBitmap); 


    } Your decodnig image in UI thread. its bad pratis. 

爲什麼你不使用畢加索呢?

接下來你下載圖像在與畢加索<目標,但沒有設置它。你需要保存設備上的文件嗎?

如果你whot只顯示圖像使用畢加索權:

calback=new Callback() { 
        @Override 
        public void onSuccess() { 
         if (progress != null) 
          progress.setVisibility(View.GONE); 
        } 

        @Override 
        public void onError() { 

         if (progress != null) 
          progress.setVisibility(View.GONE); 
        } 
       }); 
    if(imgFile.exists()){ 

     Picasso.with(mContext) 
       .load(imgFile) 
       .into(viewHolder.programImg,calback); 

    } 
    else if (isNetworkConnected()) { 
    Picasso.with(mContext) 
      .load(MYurl.BASE_URL + "/" + getItem(position).getImgMedium()) 
      .into(viewHolder.programImg,calback); 

,或者如果您保存在目標圖像加載圖像,並把他的ImageView:

Picasso.with(mContext) 
       .load(imgFile) 
       .into(tagget,calback); 

Target target= new Target() { 
     @Override 
     public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
      Runnable runnable= new Runnable() { 
       @Override 
       public void run() { 
        OutputStream imageOut = new FileOutputStream(new File("file")); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, imageOut); 
       } 
      }; 

      myThreadExecutor.execut(runnable); 
     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 

     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 

     } 
    } 

如果你願意的話,可以使用AsycTask 。但不要將圖像保存在UI terad中。也可以通過intentService和BroadcastReceiver提供下載圖像

+0

非常感謝,但我不明白如何將下載的圖像保存到回調設備( – Roman

+0

當我使用目標時,我有同樣的問題進度條 – Roman

+0

畢加索自動現金圖像。如果您需要保存下載圖像,然後應使用目標。 –