簡體   English   中英

android listview asynctask用於textview和imageview

[英]android listview asynctask for textview and imageview

我正在嘗試從Google圖書api調用生成android listview,Google圖書api調用返回JSON數據,這些屬性之一是圖書縮略圖的url,所以我考慮過運行第一個異步任務,它將調用JSON google圖書API,然后onPostExecute我將運行第二個異步任務,該任務將獲取縮略圖並將其設置為imageview,但是行為不正確,並且縮略圖與列表視圖中的正確行不相關,而僅獲取縮略圖中的縮略圖行正在更新,下載完成后,訂單混亂了。

以下是我的代碼的摘錄:

private class BookSearchListAdapter extends BaseAdapter {
    private ArrayList<Book> mBooks = new ArrayList<>();
    private LayoutInflater mLayoutInflater;

    public BookSearchListAdapter(Context c, ArrayList<Book> books) {
        mLayoutInflater = LayoutInflater.from(c);
        this.mBooks = books;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.view_book_search_row, null);
            holder = new ViewHolder();
            holder.mImageView = (ImageView) convertView.findViewById(R.id.book_cover_thumbnail);
            holder.mTitleTextView = (TextView) convertView.findViewById(R.id.book_title);
            holder.mAuthorTextView = (TextView) convertView.findViewById(R.id.book_author);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Book b = mBooks.get(position);
        holder.mAuthorTextView.setText(TextUtils.join(", ", b.getAuthors()));
        holder.mTitleTextView.setText(b.getTitle());
        if (!b.getThumbnail().equalsIgnoreCase("")) {
            new ThumbNailDownloaderTask(holder.mImageView).execute(b.getThumbnail());
        }

        return convertView;
    }

    @Override
    public int getCount() {
        return mBooks.size();
    }

    @Override
    public Object getItem(int position) {
        return mBooks.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

private static class ViewHolder {
    ImageView mImageView;
    TextView mTitleTextView;
    TextView mAuthorTextView;
}

private class SearchBookTask extends AsyncTask<String, Void, String> {

    private final String TAG = "SearchBookTask";

    private ArrayList<Book> mBooks = new ArrayList<>();

    private final static String BOOK_ITEMS_KEY = "items";
    private final static String BOOK_VOLUMEINFO_KEY = "volumeInfo";
    private final static String BOOK_IMAGELINKS_KEY = "imageLinks";
    private final static String BOOK_ID_KEY = "id";
    private final static String BOOK_TITLE_KEY = "title";
    private final static String BOOK_AUTHORS_KEY = "authors";
    private final static String BOOK_DESCRIPTION_KEY = "description";
    private final static String BOOK_THUMBNAIL_KEY = "thumbnail";

    @Override
    protected String doInBackground(String... params) {
        String bookQuery = params[0];
        String url = Uri.parse(ENDPOINT).buildUpon()
                .appendQueryParameter("q", bookQuery)
                .appendQueryParameter("maxResults", "10")
                .appendQueryParameter("key", API_KEY)
                .build().toString();
        String result = new GoogleFetcher().getUrl(url);
        return result;
    }

    @Override
    protected void onPreExecute() {
        mEmptyTextView.setVisibility(View.GONE);
        mProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPostExecute(String s) {
        if (s != null) {
            mProgressBar.setVisibility(View.GONE);
            constructBooksFromJSONResponse(s);
            mSearchResultListView.setAdapter(new BookSearchListAdapter(getActivity(), mBooks));
        }
    }

    @Override
    protected void onCancelled() {
        mProgressBar.setVisibility(View.GONE);
    }

    private void constructBooksFromJSONResponse(String jsonResponse) {
        try {
            JSONObject obj = new JSONObject(new JSONTokener(jsonResponse));
            JSONArray jsonArray = obj.getJSONArray(BOOK_ITEMS_KEY);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject currentObj = jsonArray.getJSONObject(i);

                String bookId = "";
                if (currentObj.has(BOOK_ID_KEY)) {
                    bookId = currentObj.getString(BOOK_ID_KEY);
                }

                JSONObject volumeInfo = currentObj.getJSONObject(BOOK_VOLUMEINFO_KEY);
                String bookTitle = "";
                if (volumeInfo.has(BOOK_TITLE_KEY)) {
                    bookTitle = volumeInfo.getString(BOOK_TITLE_KEY);
                }

                JSONArray bookAuthors = new JSONArray();
                if (volumeInfo.has(BOOK_AUTHORS_KEY)) {
                    bookAuthors = volumeInfo.getJSONArray(BOOK_AUTHORS_KEY);
                }
                ArrayList<String> authors = new ArrayList<>();
                if (bookAuthors != null) {
                    for (int j = 0; j < bookAuthors.length(); j++) {
                        authors.add(bookAuthors.getString(j));
                    }
                }

                String bookDescription = "";
                if (volumeInfo.has(BOOK_DESCRIPTION_KEY)) {
                    bookDescription = volumeInfo.getString(BOOK_DESCRIPTION_KEY);
                }

                JSONObject imageLinks = volumeInfo.getJSONObject(BOOK_IMAGELINKS_KEY);
                String bookThumbnail = "";
                if (imageLinks.has(BOOK_THUMBNAIL_KEY)) {
                    bookThumbnail = imageLinks.getString(BOOK_THUMBNAIL_KEY);
                }

                Book b = new Book(bookId, authors, bookTitle, bookDescription, bookThumbnail);
                mBooks.add(b);
            }
        } catch (JSONException e) {
            mBooks.clear();
        }
    }
}

private class ThumbNailDownloaderTask extends AsyncTask<String, Void, Bitmap> {

    private final WeakReference<ImageView> imageViewReference;

    private ThumbNailDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadBitmap(params[0]);
    }

    private Bitmap downloadBitmap(String param) {
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(param);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();
            if (statusCode != HttpURLConnection.HTTP_OK) {
                return null;
            }
            InputStream in = urlConnection.getInputStream();
            if (in != null) {
                Bitmap bitmap = BitmapFactory.decodeStream(in);
                return bitmap;
            }
        } catch (IOException e) {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                if (bitmap != null) {
                    imageView.setVisibility(View.VISIBLE);
                    imageView.setImageBitmap(bitmap);
                }
            }
        }
    }
}

觸發搜索的搜索按鈕如下所示:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_addbook, container, false);

    mSearchEditText = (EditText) v.findViewById(R.id.book_title_search_field);
    mSearchButton = (Button) v.findViewById(R.id.search_button);
    mSearchButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String bookQuery = mSearchEditText.getText().toString();
            new SearchBookTask().execute(bookQuery);
        }
    });
return v;
}

您可以嘗試使用Volley庫的NetworkImageView 獲取有關其圖像緩存的更多信息。 您可以在這里這里找到不錯的教程。 它應該使您的ListView圖像正確加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM