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 클래스로드는 비트 맵을 반환합니다.
감사합니다 Maxime, 그러나 나는 처음부터 안드로이드를 배우고 있으며 제 3 자 라이브러리를 사용하지 않는 것을 선호합니다. – tipi
안녕하십니까. 귀하의 문제는 안드로이드에서 listview가 작동하는 방식 (보기 메커니즘의 재활용)과 관련이 있습니다. 이 [post] (https://stackoverflow.com/a/14108676/3808178)를 읽으십시오. 자세한 내용은 제가 말하고자하는 것에 대해 설명합니다. –
정말 고마워요! – tipi