3

맞춤 연락처 앱을 만들고 있습니다. ViewHolder 디자인 패턴을 사용하여 ArrayAdapter를 사용하여 최적화 ... 미리보기 이미지를로드하는 데 많은 시간이 걸렸으므로 내 화면의 첫 번째 연락처 집합에 대해 AsyncTask 클래스를 사용하여 사진을 잘로드하고 있지만 아래로 스크롤하면 다른 연락처에 대해 무작위로 사진이 다시 순환됩니다. forumn과 몇 가지 해결책을 발견했지만 아무도 나를 위해 일한 적이 없다. 나는 ... 누군가 pls는 대신 QN 중복으로 표시의 코드에 어떤 문제가 있는지 말해 .. 아래Android - ViewHolder 및 AsyncTask- 연락처로드 중 - 축소판 문제

public class CustomList extends ArrayAdapter<String>{ 

    private final Activity context; 
    private final ArrayList<String> displayName,demoteValue,emergency; 
    ArrayList<Long> contactId; 

    public CustomList(Activity context,ArrayList<Long> contactId,ArrayList<String> displayName,ArrayList<String> demoteValue , 
      ArrayList<String> emergency) { 
     super(context, R.layout.list_single, displayName); 
     this.context = context; 
     this.displayName = displayName; 
     this.demoteValue = demoteValue; 
     this.emergency = emergency; 
     this.contactId=contactId; 

    } 

    class MyViewHolder 
    { 
     public QuickContactBadge imageView; 
     public TextView txtTitle; 
     int position; 

     MyViewHolder(View v){ 
      txtTitle = (TextView) v.findViewById(R.id.txt); 
      imageView = (QuickContactBadge) v.findViewById(R.id.contactimageentry); 
     } 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView=convertView; 
     MyViewHolder holder=null; 

     if(rowView==null) 
     { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.list_single, parent, false); 
      holder=new MyViewHolder(rowView); 
      rowView.setTag(holder); 

     }else{ 
      holder= (MyViewHolder) rowView.getTag(); 
     } 

     holder.txtTitle.setText(displayName.get(position)); 
     holder.txtTitle.setPadding(5, 5, 5, 5); 
     //Some BLA BLA BLA work. 
     if(emergency.get(position).equals("1")){ 

      holder.txtTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,25); 
      holder.imageView.getLayoutParams().width=getPixels(TypedValue.COMPLEX_UNIT_DIP,50); 

}    
     //Get and set the photo-HERE LIES THE CALL TO THE PROBLEM 
     holder.position = position; 
     new LoadContactImage(getContext(),holder,position,contactId.get(position)) 
     .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);  
     return rowView; 
    } 
} 

을 내 코드를 넣어 그리고 여기에 기반 이미지를로드 내 비동기 작업에 대한 코드입니다하여야한다 내가 그것을 호출하는 동안 통과 한 ID

public class LoadContactImage extends AsyncTask<Object, Void, Bitmap> { 

private long Path; 
private MyViewHolder mHolder; 
private int mposition; 
Context ctx; 

public LoadContactImage(Context context,MyViewHolder holder,int position,Long id) { 
    this.mHolder= holder; 
    this.Path = id; 
    this.mposition=position; 
    this.ctx= context; 
} 

@Override 
protected Bitmap doInBackground(Object... params) { 
    Uri my_uri = getPhotoUri(Path); 
    ContentResolver cr = ctx.getContentResolver(); 
    InputStream in = null; 
    try { 
     in = cr.openInputStream(my_uri); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Bitmap bitmap = BitmapFactory.decodeStream(in); 
    return bitmap; 
} 

@Override 
protected void onPostExecute(Bitmap result) { 

    super.onPostExecute(result); 
    if (result != null && mposition == mHolder.position) { 
     //imv.setImageBitmap(result); 
     mHolder.imageView.setImageBitmap(result); 
    } 
} 
} 
+0

여기에는 문제가 없습니다. holder.imageView.setImageBitmap은 getView 메소드에서 처음으로 holder를 만들었을 때의 원래 위치로 호출해야합니다. 그렇지 않으면로드가 완료 될 때까지 이미지는 여전히 이전 값을 갖습니다. –

+0

감사 또는 답변 ...하지만 난 정말 당신의 변화를 얻을 .. pls illustarte 수 또는 변경할 코드를 강조 표시 할 수 있습니까? –

+1

을로드하기 전에 AsyncTask를로드해야합니다. 그렇지 않으면 이전 이미지가 계속 표시되므로 holder.imageView.setImageBitmap (loadingImage)을 설정해야합니다. ListView가 뷰를 재활용하기 때문에 맨 위에서 스크롤되는 뷰가 다시 삽입됩니다. 하단 (및 다른 방법). –

답변

3

그걸 알아 냈어 ... 이제 그 일을 .. Simon Meyer가 쓴 의견은 맞다. 비동기 작업을 호출하기 전에 getView()에서 비트 맵으로 imageView를 초기화 할 수 있습니다. 코드의 변경입니다.

holder.position = position; 

holder.imageView.setImageURI(Uri.parse("android.resource://com.vishnu.demotingprototype/drawable/ic_contact_picture")); 

new LoadContactImage(getContext(),holder,position,contactId.get(position)).execute(); 
0

나는 당신의 customclass가 lader 이미지 클래스의 문맥을 찾지 못한다고 생각한다. yorr 활동의 문맥을 선언하십시오 first.all은 이것보다 잘됩니다 ... 그것의 작동 원리는 좋음

+0

하지만 둘 다 선생님 이 클래스는 내 액티비티 안에 있지 않습니다. 나는 그것들을 별도의 클래스로 두었습니다 ... 그래서 getContext()가 작동하지 않습니다. 왜 문맥을 Async 클래스의 인수로 전달했는지 ... 문제가 있다는 것을 의미합니까? 그렇다면 컨텍스트를 얻는 방법? –