0

느린로드를 사용하여 Url에서 내 갤러리의 이미지를로드하려고하는데 모든 것이 정상적으로 작동합니다. 사이트에서 이미지를로드 할 때까지 ProgressBar을 표시합니다. 모든 방법을 시도했지만 첫 번째 이미지를 건너 뛰고 내 요구 사항에 따라 나머지 이미지를 완벽하게 표시합니다. I 로그를 검사하고 그 결과 그것 로딩 전에 다시 일으키는 동시에 세 번 호출 될 때 첫 화상을 표시하지 않도록 나는 두 이미지가 있다면 getView 방법 position00010001를 나타내고 있다는 것이다. 그래서 제 질문은 한 번에 3 번 호출하는 이유입니다. 이것에 관한 많은 질문을 검색했지만 시퀀스는 0101이며 문제가되지 않습니다. 왜 그런가?GetView 0 번 위치가 3 번 반복되어 표시되는 첫 번째 이미지 건너 뛰기

다음은 일부 코드입니다.

여기 내 사용자 지정 ImageView

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 

public class WebImageView extends ImageView { 

    private Drawable image; 
    private ProgressBar placeholder; 

    public WebImageView(Context context) { 
     super(context); 
    } 
    public WebImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
    public WebImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setPlaceholderImage(int resid) { 
     View view = (View)this.getParent(); 
     placeholder = (ProgressBar)view.findViewById(resid); 
     if (image == null) { 
      placeholder.setVisibility(View.VISIBLE); 
     } 
    } 

    @SuppressWarnings("deprecation") 
    public void setIt(Bitmap result){ 
     image = new BitmapDrawable(result); 
     if (image != null) { 
      try{Thread.sleep(2000);}catch(Exception e){} 
      placeholder.setVisibility(View.GONE); 
      setImageDrawable(image); 
     } 
    } 
} 

CustomAdapter이다.

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

import com.smartsync.ImageCache; 
import com.smartsync.R; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 

public class ImageAdapter extends ArrayAdapter<URL> { 
    private Activity activity; 
    private int layoutResourceId; 
    private ArrayList<URL> data = new ArrayList<URL>(); 
    ExecutorService exec; 
    private ImageCache cache; 

    public ImageAdapter(Context context, int layoutResourceId, ArrayList<URL> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.activity = (Activity)context; 
     exec = Executors.newSingleThreadExecutor(); 
     this.data = data; 
     this.cache = new ImageCache(context); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     final URL url = data.get(position); 
     final WebImageView image; 

     if (row == null) { 
      row = activity.getLayoutInflater().inflate(layoutResourceId, parent, false); 
      image = (WebImageView) row.findViewById(R.id.webimage); 
      image.setPlaceholderImage(R.id.pbar); 
      this.notifyDataSetChanged(); 
      row.setTag(image); 
     } 
     else 
      image = (WebImageView) row.getTag(); 

     final ImageAdapter adapter = this; 
     /*if(position == 0){ 
      row.setVisibility(View.GONE); 
      return row; 
     }*/ 
     exec.execute(new Runnable(){    
      @Override 
      public void run() { 
       try { 
        Bitmap bitmap = null; 
        bitmap = cache.getBitmap(url); 
        if(bitmap == null){ 
         BitmapFactory.Options options = new BitmapFactory.Options(); 
         options.inPurgeable = true; 
         options.outHeight = 100; 
         options.outWidth = 100; 
         options.inSampleSize = 5; 
         bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options); 
         cache.setCache(bitmap, url); 
        } 
        final Bitmap bmp = bitmap; 
        activity.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          image.setIt(bmp); 
          adapter.notifyDataSetChanged(); 
         } 
        }); 
       } catch (Exception e) { 
        Log.i("test", ""+e); 
       } 
      } 
     }); 

     return row; 
    } 

} 

그리고 이것은 단일 행에 대한 레이아웃입니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" 
    android:orientation="vertical" 
    android:padding="5dp" 
    android:clickable="true" 
    android:focusable="true"> 

    <com.smartsync.adapters.WebImageView 
     android:id="@+id/webimage" 
     android:background="@xml/border" 
     android:cropToPadding="true" 
     android:scaleType="centerCrop" 
     android:padding="3dip" 
     android:adjustViewBounds="true" 
     android:layout_width="100dp" 
     android:layout_height="100dp" /> 

    <ProgressBar 
     android:id="@+id/pbar" 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" /> 

</RelativeLayout> 

이 문제를 해결하는 방법을 알려주십시오. 이 직책 문제에 관한 모든 질문을 검색했지만 해결할 수 없었습니다.

답변

0

나는 다시 그 이유를 발견했다. 문제는 그걸 다시 그려야하는 getView()this.notifyDataSetChanged();을 호출했기 때문에 문제가 발생하여로드 자체를 시작합니다. 방금이 라인을 삭제했습니다. 이 줄은 우리가 데이터 세트의 수를 변경할 때 사용되기 때문에 필요하지는 않지만 내 경우에는 이미로드 된 것입니다. 진행률 막대를 제거하고 이미지를로드하는 것이이 행의 작업이 아닙니다.