2012-09-08 2 views
0

당신의 도움이 필요합니다!GridView 어댑터 이미지를 표시 할 때 AsyncTask 이상한 동작이 발생했습니다.

내 응용 프로그램에서는 이미지를 GridView에 표시 할 때 이상한 동작이 발생합니다. 셀은 기본 R.id.noimage 및 이전에 본 이미지 대신 이미지를 표시합니다. 이 어댑터는 비트 맵 AsyncTask을로드하기 위해 추가 한 후에 나타납니다.

내가 뭘 잘못하고 있니?

코드 :보기가 null보기를 팽창 및 태그를 설정할 때이 아니 다음이 태그를 사용하는 경우

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 
    View vi = null; 
    ImageView image; 
    if(convertView==null) { 
     vi = inflater.inflate(R.layout.gall_item, null); 
     Log.i("info","convertView==null"); 
    } else { 
     vi = inflater.inflate(R.layout.gall_item, null); 
     Log.i("info","else"); 
    } 
    holder.position = position; 
    image = (ImageView)vi.findViewById(R.id.img); 
    TextView url_img = (TextView)vi.findViewById(R.id.url_img); 
    TextView cer = (TextView)vi.findViewById(R.id.cer); 
    TextView idi = (TextView)vi.findViewById(R.id.ids); 
    url_img.setText(img2[position]); 
    cer.setText(cer_ar[position]); 
    idi.setText(id_ar[position]); 
    new LoadImageT(holder).execute(image, img1[position],activity.getApplicationContext(),position); 
    return vi; 
} 

class LoadImageT extends AsyncTask<Object, Void, Bitmap> { 
    Context context; 
    private ImageView imv; 
    private String url; 
    private Bitmap bitmap = null; 
    private int posS; 
    private ViewHolder mHolder; 

    public LoadImageT(ViewHolder holder) { 
     mHolder = holder; 
    } 

    @Override 
    protected Bitmap doInBackground(Object... params) { 
     imv = (ImageView) params[0]; 
     url = (String) params[1]; 
     context = (Context)params[2]; 
     posS = (Integer) params[3]; 
     bitmap = imageLoader.getBitmaptrue(url,imv,context); 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     if (mHolder.position == posS) { 
      imv.setVisibility(View.VISIBLE); 
      imv.setImageBitmap(result); 
     } else { 
      int stub_id = R.drawable.noimage; 
      imv.setImageResource(stub_id); 
     } 
    } 
} 
+1

레이아웃을 두 번 팽창시키는 데있어 Ther의 의미가 없습니다. convertView == null 일 때, null이 아닌 경우. 널 때만 팽창해야합니다. ** 추신 : 이것은 아마 당신의 문제를 해결하지 않을 것이며 단지 관찰 일뿐입니다. ** –

답변

0

당신이 잘못된 방식으로 그 일을하는, 앤디 등 우선 당신에게 제안 null이지만 목록보기 효율성에만 영향을 미칩니다. 두 번째로 비동기 작업 코드를 어댑터에서 제거하여 작업에 넣고 개체를 사용합니다. 자세한 내용은 link Gilles가 효율적으로 멀티 스레딩을 수행하는 방법을 설명합니다.

관련 문제