2017-12-11 3 views
0

저는 비동기 작업을 사용하여 일부 이미지를로드하고 ListView에 채우려고하는 Android 초보자입니다. 그러나 현재 코드를 사용하면 이미지가 올바른 ImageViews으로 설정되지 않고 스크롤 할 때마다 이미지가 변경됩니다. 나는 실수하고있는 것을 발견 할 수 없다. 미리 감사드립니다.ListView의 이미지가 계속 이동합니다.

public class BookAdapter extends ArrayAdapter<Book> { 

    public BookAdapter(Context context, ArrayList<Book> objects) { 
     super(context, 0, objects); 
    } 

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

     // inflate a view if its empty 
     if (booksView == null) { 
      holder = new ViewHolder(); 

      booksView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 

      holder.bookName = booksView.findViewById(R.id.book_name_textView); 
      holder.publishedDate = booksView.findViewById(R.id.dateTextView); 
      holder.bookAuthor = booksView.findViewById(R.id.author_textView); 
      holder.bookImage = booksView.findViewById(R.id.book_image); 


      booksView.setTag(holder); 

     } else { 
      holder = (ViewHolder) booksView.getTag(); 

     } 

     Book currentBook = getItem(position); 

      if (holder.bookImage != null && currentBook.getBookImage()!=null) { 
       new LoadImages(holder.bookImage).execute(currentBook.getBookImage()); 
      } 

      holder.bookName.setText(currentBook.getBookName()); 
      holder.bookAuthor.setText(currentBook.getAuthor()); 
      holder.publishedDate.setText(currentBook.getDate()); 

     return booksView; 

    } 

    private class ViewHolder { 
     ImageView bookImage; 
     TextView bookName; 
     TextView bookAuthor; 
     TextView publishedDate; 
    } 

} 

AsyncTask를

public class LoadImages extends AsyncTask<String,Void,Bitmap>{ 
     private WeakReference<ImageView> imageview; 
     public LoadImages(ImageView imv){ 
      imageview=new WeakReference<ImageView>(imv); 
     } 
     /** Background process 
     * input:url 
     * output: Bitmap image 
     * It passed into onPostExecute method 
     **/ 
     @Override 
     protected Bitmap doInBackground(String... urls) { 

     return QueryUtils.fetchBookImages(urls[0]); 
     } 

     /** This method called after the doINputBackground method 
     * input:Bitmap image 
     * output: image set into the image view 
     * Image view passed from RecyclerViewOperation to ShowImage class through constructor 
     **/ 
     @Override 
     protected void onPostExecute(Bitmap result) { 
      if((imageview!=null)&&(result!=null)){ 
       ImageView imgview=imageview.get(); 


       if(imgview!=null){ 

        imgview.setImageBitmap(result); 
       } 
      } 
     } 
    } 

참고를 위해 다음 클래스를 사용 : fetchBookImages 클래스로드는 비트 맵을 반환합니다.

답변

0

이미 직면 한 문제를 이미 해결 한 잘 알려진 도서관이 있습니다.

  • Glide
  • 그리고 당신은 here을 찾을 수 있도록 많은 다른 Picasso

    • .

    +1

    감사합니다 Maxime, 그러나 나는 처음부터 안드로이드를 배우고 있으며 제 3 자 라이브러리를 사용하지 않는 것을 선호합니다. – tipi

    +0

    안녕하십니까. 귀하의 문제는 안드로이드에서 listview가 작동하는 방식 (보기 메커니즘의 재활용)과 관련이 있습니다. 이 [post] (https://stackoverflow.com/a/14108676/3808178)를 읽으십시오. 자세한 내용은 제가 말하고자하는 것에 대해 설명합니다. –

    +0

    정말 고마워요! – tipi

    관련 문제