0

私は YouTube API を使用して YouTube からビデオを再生しています(明らかに)。これはこれまでのところ非常にうまく機能しています。私が抱えている問題は、リスト ビューを使用してさまざまなビデオのタイトルとサムネイルを表示していることです。これには、カスタム アダプターと YouTubeThumbnailView が必要です。

現在、私が持っているコードは、サムネイルをロードしてマップに正しく保存するという点で十分に機能しますが、ビューが再作成され、サムネイルをマップから再度取得する必要がある場合、間違ったものが表示されることがあり、非常に頻繁に重複します.

アダプターコードは次のとおりです。

public class VideoListAdapter extends BaseAdapter implements
    YouTubeThumbnailView.OnInitializedListener{

Map<View, YouTubeThumbnailLoader> mLoaders;

public VideoListAdapter(final Context context, final List<Video> list, final int layoutResourceId) {
    mList = VideoManager.getInstance().getContentList();
    this.mLayID = layoutResourceId;
    this.mContext = context;
    mList = list;
    mLoaders = new HashMap<View, YouTubeThumbnailLoader>();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View mCurrentRow = convertView;
    PostHolder holder;
    String videoId = mList.get(position).videoId;

    if(mCurrentRow == null)
    {
        LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
        mCurrentRow = inflater.inflate(mLayID, parent, false);

        holder = new PostHolder();
        holder.txtTitle = (TextView)mCurrentRow.findViewById(R.id.list_content_title);
        holder.txtTitle.setText(mList.get(position).title);

        //Case 1 - Initalise the thumbnail
        holder.thumb = (YouTubeThumbnailView) mCurrentRow.findViewById(R.id.list_content_thumb);
        holder.thumb.setTag(videoId);
        holder.thumb.initialize(Utils.DEVELOPER_KEY, this);

        mCurrentRow.setTag(holder);
    }
    else
    {
        holder = (PostHolder) mCurrentRow.getTag();
        YouTubeThumbnailLoader loader = mLoaders.get(holder.thumb);

        //Set the title
        Video post = mList.get(position);
        if(post != null){
            holder.txtTitle.setText(post.title);
        }

        if (holder.loader == null)
        {
            //Case 2 - Loader is currently initializing
           holder.thumb.setTag(videoId);
        } else
        {
            //Case 3 - The loader is already initialised
            holder.thumb.setImageResource(R.drawable.ic_launcher);
            holder.loader.setVideo(videoId);
        }
    }
    return mCurrentRow;
}

@Override
public void onInitializationSuccess(YouTubeThumbnailView view, YouTubeThumbnailLoader loader) {
    String videoId = (String) view.getTag();
    mLoaders.put(view, loader);
    view.setImageResource(R.drawable.ic_launcher);
    loader.setVideo(videoId);
}

@Override
public void onInitializationFailure(
        YouTubeThumbnailView thumbnailView, YouTubeInitializationResult errorReason) {
    if (errorReason.isUserRecoverableError()) {
        if (errorDialog == null || !errorDialog.isShowing()) {
            //errorDialog = errorReason.getErrorDialog(, RECOVERY_DIALOG_REQUEST);
            errorDialog.show();
        }
    } else {
        /*String errorMessage =
                String.format(getString(R.string.error_thumbnail_view), errorReason.toString());
        Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();*/
    }
}

static class PostHolder
{
    YouTubeThumbnailView thumb;
    YouTubeThumbnailLoader loader;
    TextView txtTitle;
    TextView txtTime;
}

ドキュメントを読み、サンプル アプリケーションを調べましたが、役立つ情報が見つかりませんでした。これは YT API の問題ではなく、ImageView の保存方法に問題がある可能性があります。

誰かが何か助けを提供できるなら、私は感謝します、前もって感謝します。

4

1 に答える 1

3

YouTubeThumbnailLoader を PostHolder クラスに保存してはいけませんが、すべてのローダーを mLoaders HashMap で処理できるようにします。コメントで気づいたように、コールバックによってローダーをセットアップするには、この HashMap が必要です。したがって、getView() メソッドの else 部分を次のように変更します。

     } else {

        holder = (PostHolder) convertView.getTag();

        //Set the title
        Video post = mList.get(position);
        if(post != null){
            holder.txtTitle.setText(post.title);
        }

        // 2) and 3) The view is already created...
        YouTubeThumbnailLoader loader = mLoaders.get(holder.thumbnailView);

        // ...and is currently being initialized. We store the current videoId in the tag.
        if (loader == null) {
            holder.thumbnailView.setTag(videoId);

        // ...and already initialized. Simply set the right videoId on the loader.
        } else {
            holder.thumbnailView.setImageResource(R.drawable.ic_launcher);
            loader.setVideo(videoId);

        }
    }

あなたの Post Holder クラスは Loader を必要としません:

 static class PostHolder
 {
   YouTubeThumbnailView thumbnailView;
   TextView txtTitle;
   TextView txtTime;
 }
于 2014-01-29T20:55:31.583 に答える