0

次のリンクを参照してViewHolder パターンをリファクタリングListViewします: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ArrayAdapter

私の ListView アイテムには、各アイテムにビューを動的に追加する非同期 http-json 操作があります。しかし、いくつかの子ビューが他のアイテムに重複してアタッチされているという問題があります。再利用されたビューが原因である可能性があります。しかし、私はほとんどそれを扱いません。

次のソース コード (上記のリンクから貼り付けられた Async 読み込みセクション) はほとんど理解できませんif (mHolder.position == mPosition)true

はアダプタ クラスの内側に配置されていますか、static class ThumbnailTaskそれともアダプタ クラスの外側に配置されていますか? アダプタークラスの内部にも配置されていますか(私はそうしました。表示される各アイテムに辞任されているstatic class ViewHolderことがわかります)?ViewHolder

public View getView(int position, View convertView,
    ViewGroup parent) {
    ViewHolder holder;

    ...

    holder.position = position;

    new ThumbnailTask(position, holder)
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

    return convertView;
}

private static class ThumbnailTask extends AsyncTask {
private int mPosition;
private ViewHolder mHolder;

public ThumbnailTask(int position, ViewHolder holder) {
    mPosition = position;
    mHolder = holder;
}

@Override
protected Cursor doInBackground(Void... arg0) {
    // Download bitmap here
}

@Override
protected void onPostExecute(Bitmap bitmap) {
        if (mHolder.position == mPosition) {
            mHolder.thumbnail.setImageBitmap(bitmap);
        }
    }
}

private static class ViewHolder {
    public ImageView thumbnail;
    public int position;
}
4

1 に答える 1

0

私のばか。

クラスgetView()でのレイアウトを初期化する必要があります。Adapterたとえば、子レイアウトは または である必要があるGONEか、アイテムのいくつかのビューをアタッチしたときにVISIBLEクリーンアップする必要があります。removeAllViews()

ViewHolderパターンは、各行のレイアウト ステータスを維持し、再利用されても表示します。

于 2013-10-26T17:31:23.253 に答える