3

我正在创建一个自定义联系人应用程序..我使用ViewHolder的ArrayAdapter设计模式进行优化...由于加载缩略图图片需要很多时间,使用AsyncTask类来加载图像,对于我的屏幕中的第一组联系人,图片加载得很好,但当我向下滚动时,同一组图片随机重新循环其他联系人...我已经搜索过forumn,并找到了一些解决方案,但没有为我工作。我将我的代码如下..有人请告诉我什么是错的代码,而不是将其标记为复制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方法中创建持有者时的原始内容。否则,图像仍然具有旧值,直到加载完成。 –

+0

感谢或你的回应...但我真的没有得到你的改变...你可以说明它或突出显示应该改变的代码? –

+1

在开始加载AsyncTask之前,您应该设置holder.imageView.setImageBitmap(loadingImage),否则旧图像仍会显示,因为ListView会循环它的视图 - 在顶部滚动的那个会重新插入到底部(和其他方式)。 –

回答

3

想出来了......现在它的工作...... Simon Meyer给出的评论是正确的..我需要在我可以调用Async Task之前将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

我认为你的自定义类没有找到lader图像类的上下文。 首先在你的活动中声明上下文。所有这一切都很顺利,而不是这个......它的工作很好

+0

但是,先生们这些类不在我的活动中......我把它们作为单独的类...所以getContext()不起作用,tats为什么我已经将上下文作为Async类的参数传递......是否意味着它是问题?如果是的话如何获得上下文? –