2016-06-18 2 views
0

У меня есть recyclerview, которому необходимо загрузить youtube видео один под другим похожим списком, ниже приведен код. Для этого я использовал youtube api.Youtubeview с RecyclerView loading

Проблема с приведенным ниже кодом заключается в том, что загружается только последнее видео, переданные значения являются правильными и работают. Другие видео в списке не загружаются, и для них есть черный экран.

public class YoutubeAdapter extends RecyclerView.Adapter<YoutubeAdapter.MyViewHolder> { 
    private String developer_key = "My Developer Key"; 
    private Context context; 
    private ArrayList<String> video_id; 
    private LayoutInflater inflater; 

    public YoutubeAdapter(Context context, ArrayList<String> video_id) { 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.video_id = video_id; 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     YouTubePlayerView youtubeView; 
     public MyViewHolder(View view) { 
      super(view); 
      youtubeView = (YouTubePlayerView) view.findViewById(R.id.youtubeView); 
     } 
    } 

    @Override 
    public YoutubeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = inflater.inflate(R.layout.video_content,parent,false); 
     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     final String video_string = video_id.get(position); 
     holder.youtubeView.initialize(developer_key, new YouTubePlayer.OnInitializedListener() { 
      @Override 
      public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
       if (!b) { 
        youTubePlayer.cueVideo(video_string); 
       } 
      } 

      @Override 
      public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
       Toast.makeText(context, "Failed to load video", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 


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

    @Override 
    public int getItemCount() { 
     return video_id.size(); 
    } 
} 
+0

Вы имеете в виду, что миниатюры 'youtube videos' не загружаются? –

+0

Я использовал только i youtube view, а не thumbnailview .. происходит то, что только последнее видео с кнопкой видно и может быть воспроизведено. –

+0

- это ваш «Адаптер», содержащий все данные, которые вы проверили, это 'Array List' размер? –

ответ

0

Я столкнулся с той же проблемой, поэтому я попытался использовать класс POJO для хранения всех элементов. Затем используйте getters в recyclerviewOnBindHolder. Это сработало.

private YouTube youTube; 
    private YouTube.Search.List query; 
    public static final String DEVELOPER_KEY="YOUR KEY"; 

    public YoutubeConnector(Context context) { 

     youTube= new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() { 
      @Override 
      public void initialize(HttpRequest httpRequest) throws IOException { 

      } 
     }).setApplicationName(context.getString(R.string.app_name)).build(); 

     try { 

      //this is to filter the query 
      query= youTube.search().list("id,snippet"); 
      query.setKey(DEVELOPER_KEY); 
      query.setChannelId(CHANNEL_ID); 
      query.setType("video"); 
      query.setMaxResults((long) 50); 
      query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)"); 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


    } 

    public List<VideoItem> queryResult(){ 

     try { 
      // this is youtube built in SearchResponse 
      SearchListResponse response= query.execute(); 

      List<SearchResult> listResult= response.getItems(); 

      List<VideoItem> videoItem= new ArrayList<>(); 

      for (SearchResult result:listResult){ 

       VideoItem item= new VideoItem(); 

       item.setTITLE(result.getSnippet().getTitle()); 
       item.setID(result.getId().getVideoId()); 
       item.setDESCRIPTION(result.getSnippet().getDescription()); 
       item.setURL(result.getSnippet().getThumbnails().getDefault().getUrl()); 

       videoItem.add(item); 
      } 

      return videoItem; 

     } catch (IOException e) { 
      e.printStackTrace(); 

      return null; 
     } 

    } 

Так что я сделал:

  1. создать класс, который обрабатывает сетевую часть, как я показал выше.
  2. Я создаю класс POJO под названием VideoItem.
  3. Я использую youtube, встроенный в SearchResponse -> SearchListResponse response = query.execute();

4. Сохраните весь ответ в Youtube, построенном в классе Pojo Список listResult = response.getItems();

5.I зацикливание всех элементов из listResult и сохранение его в моем собственном классе POJO VideoItem.

6.I хранить весь свой видеофайл внутри Список видеоItem = new ArrayList <>();

Смежные вопросы