맞춤 연락처 앱을 만들고 있습니다. 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);
}
}
}
여기에는 문제가 없습니다. holder.imageView.setImageBitmap은 getView 메소드에서 처음으로 holder를 만들었을 때의 원래 위치로 호출해야합니다. 그렇지 않으면로드가 완료 될 때까지 이미지는 여전히 이전 값을 갖습니다. –
감사 또는 답변 ...하지만 난 정말 당신의 변화를 얻을 .. pls illustarte 수 또는 변경할 코드를 강조 표시 할 수 있습니까? –
을로드하기 전에 AsyncTask를로드해야합니다. 그렇지 않으면 이전 이미지가 계속 표시되므로 holder.imageView.setImageBitmap (loadingImage)을 설정해야합니다. ListView가 뷰를 재활용하기 때문에 맨 위에서 스크롤되는 뷰가 다시 삽입됩니다. 하단 (및 다른 방법). –