2016-12-07 3 views
-1

리스트 아이템에 이미지가있는리스트 뷰가 있습니다. listview에 대한 사용자 지정 어댑터를 사용하고 있습니다. AsyncTask를 사용하여 어댑터의 각 목록 항목에 대한 이미지를 다운로드합니다. 내 사용자 지정 어댑터의 코드 :리스트 뷰에 이미지를 올바르게로드 중

public class AdapterUcomment extends ArrayAdapter<UserModel> { 


public AdapterUcomment(Activity context, List<UserModel> list) { 
    super(context, R.layout.layout_comment_item, list); 
    this.context = context; 
    this.list = list; 
} 

class ViewHolder { 
    protected TextView text1, text2, text3; 
    protected ImageView imagev; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 

     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.layout_comment_item, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text1 = (TextView) view.findViewById(R.id.txtv_uname); 
     viewHolder.text2 = (TextView) view.findViewById(R.id.txtv_comment); 
     viewHolder.text3 = (TextView) view.findViewById(R.id.txtv_cmntTime); 
     viewHolder.imagev = (ImageView) view.findViewById(R.id.imgv_upic); 
     view.setTag(viewHolder); 

    } else { 
     view = convertView; 
    } 
    positionPic = position; 
    final ViewHolder holder = (ViewHolder) view.getTag(); 
    String uname = list.get(position).getUname(); 
    String ufbid = list.get(position).getUfbid(); 
    String ucomment = list.get(position).getUcomment(); 
    String ucomment_time = list.get(position).getUcomment_time(); 


    holder.text1.setText(Html.fromHtml(uname)); 
    holder.text2.setText(Html.fromHtml(ucomment)); 
    holder.text3.setText(Html.fromHtml(ucomment_time)); 

    // downloading the image using AsyncTask 

    new UserPic(position, ufbid, holder.imagev).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

    return view; 
} 


public class UserPic extends AsyncTask<String, Void, String> { 
    String ufbid = null; 
    Bitmap bitmap = null; 
    ImageView imageView; 
    int pos = 0; 
    public UserPic(int pos, String ufbid, ImageView imageView) { 
     this.ufbid = ufbid; 
     this.imageView = imageView; 
     this.pos = pos; 
    } 

    @Override 
    protected String doInBackground(String... strings) { 
     URL imageURL = null; 
     try { 
      imageURL = new URL("......."); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     try { 
      bitmap = BitmapFactory.decodeStream(imageURL.openConnection().getInputStream()); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     imageView.setImageBitmap(bitmap); 
     super.onPostExecute(s); 

    } 
} 

모든 보인다는 다음과 같이 첫 눈에 잘 작동합니다 : image of listview with properly loaded images 그러나 문제는 내가 마지막 항목으로 스크롤 한 후 다시 첫 번째 항목으로 스크롤 할 때 시작 첫 번째 목록 항목 이미지가 다음과 같이 사라집니다. image of listview with improperly loaded image 이렇게하면 어떻게 제거하고 이미지를 제대로 listview에서 제대로로드 할 수 있습니까? 미리 감사드립니다.

+0

이미지 로더 라이브러리를 사용하십시오. 링크 : https://github.com/nostra13/Android-Universal-Image-Loader –

+0

질문이 bazillion 번 요청되었습니다 ... 재사용보기 때문입니다 ... 1. getView가 1 위치에서 호출되면 asynctask1이 시작됩니다. 2. getView가 시작됩니다. 위치 2에서 다시 호출하면 포인트 1의 뷰가 재사용되고 asynctask2 ... 3을 시작합니다. asynctask2가 완료되고 오른쪽 이미지가 설정됩니다. 4. asynctask1이 완료되고 잘못된 이미지가 설정됩니다. ** 쉬운 솔루션 프로덕션 응용 프로그램의 경우) URL을 imageview에 태그로 저장 AsyncTask에 전달 된 URL과 비교하여 비트 맵을 설정하기 전에 ... 다른 경우 설정하지 않음 ** – Selvin

답변

1

Picasa 또는 Glide와 같은 이미지로드 라이브러리를 사용하여 이미지를 목록보기로로드합니다. 또한, recyclerview 사용을 고려해 보셨습니까?

여기 피카소에 대한 자세한 정보입니다 : 이 http://square.github.io/picasso/

+0

Picasa 라이브러리를 사용하고 있지만 여전히 동일한 오류가 발생합니다. 어떤 생각? –

+0

는 마침내 Recyclerview와 Glide 라이브러리를 사용하여이 문제를 해결했습니다. –

관련 문제