Initialize() in VideoViewHolder is not getting called.
androidvk opened this issue · comments
I am trying to implement video playing where screen orientation will always be fixed. I have tried a lot of ways. Finally, I copied the way you declared adapter and holders but initialize() or ToroPlayer listeners are not getting called.
I also used it on my default adapter where initialize was getting called before onBind() there I was unable to get URI.
Sample Video Link:: https://www.radiantmediaplayer.com/media/bbb-360p.mp4
I'm using latest version of the library. which is 3.7.2.......3
RecyclerView Fragment.
**
private void setupRecyclerView() {
final Query query = postRef;
PreCachingLayoutManager layoutManager = new PreCachingLayoutManager(getActivity());
layoutManager.setExtraLayoutSpace(Store.getDeviceHeight());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
forumHelpers = new ArrayList<ForumHelper>();
recyclerView.setLayoutManager(layoutManager);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setItemViewCacheSize(20);
forumAdapter = new TimelineAdapter(forumHelpers, getActivity(), query, recyclerView);
recyclerView.setAdapter(forumAdapter);
recyclerView.setCacheManager(forumAdapter);
recyclerView.setPlayerSelector(PlayerSelector.DEFAULT);
} **
RecyclerView Adapter:::
** public class TimelineAdapter extends RecyclerView.Adapter
implements CacheManager {
private static final String TAG = "TimelineAdapter";
static final int TYPE_IMAGE = 1;
static final int TYPE_VIDEO = 2;
@Nullable
private Callback callback;
private List<ForumHelper> forumHelpers = new ArrayList<>();
private final Query query;
private RecyclerView feedRecycler;
private RequestManager requestManager;
private PreCachingLayoutManager layoutManager;
private List<String> contentIds = new ArrayList<>();
private ForumHelper forumHelperChanged;
private long id;
private Context activity;
private View vidPost;
public DocumentSnapshot lastResult;
public TimelineAdapter(final List<ForumHelper> forumHelpers, final Context activity,
final Query query, RecyclerView feedRecycler) {
super();
this.activity = activity;
this.forumHelpers = forumHelpers;
this.query = query;
this.feedRecycler = feedRecycler;
setHasStableIds(true);
getData(forumHelpers, query); // for getiing data from firebstore and
}
public void setCallback(@nullable Callback callback) {
this.callback = callback;
}
@Override
public long getItemId(int position) {
return position;
}
@NonNull
@Override
public TimelineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final TimelineViewHolder viewHolder = TimelineViewHolder.createViewHolder(parent, viewType);
viewHolder.setClickListener(v -> {
int pos = viewHolder.getAdapterPosition();
if (callback != null && pos != RecyclerView.NO_POSITION) {
callback.onItemClick(viewHolder, v, getItem(pos), pos);
}
});
return viewHolder;
}
private ForumHelper getItem(int pos) {
return forumHelpers.get(pos);
}
@Override
public int getItemViewType(int position) {
if (forumHelpers.get(position).getType().equals(kMap.video)) {
return TYPE_VIDEO;
} else return TYPE_IMAGE;
}
@Override
public void onBindViewHolder(@NonNull TimelineViewHolder holder, int position) {
forumHelpers.get(position).setIndex(position);
holder.bind(this, holder, getItem(position), null);
holder.setClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "onBindViewHolder:Index::" + getItem(position).getIndex());
Log.e(TAG, "onClick: Position::" + position);
}
});
}
@Override
public void onViewRecycled(@NonNull TimelineViewHolder holder) {
holder.onRecycled();
}
@Override
public int getItemCount() {
return forumHelpers.size();
}
static abstract class Callback {
abstract void onItemClick(@NonNull TimelineViewHolder viewHolder, @NonNull View view,
@NonNull ForumHelper item, int position);
}
// Implement the CacheManager;
@NonNull
@Override
public Object getKeyForOrder(int order) {
Log.e(TAG, "getKeyForOrder: " + order);
return getItem(order);
}
@Nullable
@Override
public Integer getOrderForKey(@NonNull Object key) {
Log.e(TAG, "getOrderForKey: " + key);
return key instanceof ForumHelper ? forumHelpers.indexOf(key) : null;
}
}
**
Recyclerview View Holder
** public class TimelineViewHolder extends RecyclerView.ViewHolder {
private static final String TAG = "TimelineViewHolder";
private static final int LAYOUT_RES = R.layout.z_feed_main;
public ImageView iHeart;
public CircleIndicator2 indicator;
private List<String> contentIds;
public TextView time_post, tLiked, tViewCount, tComment;
public Context context;
public ImageView privacyBtn;
public CircleImageView profileImg;
public TextView name_post, userId;
public View imageContainer, textContainer, videoContainer;
public FirebaseFirestore db = FirebaseFirestore.getInstance();
//Header
public ImageButton ib_more;
public View lHeader2;
//Text Holder
public SocialTextView tRawText;
private ImageView iBackground;
public SocialTextView stTextView;
//ImageHolder
public RecyclerView recyclerView;
public RelativeLayout iRL;
public TimelineViewHolder(@NonNull View itemView) {
super(itemView);
imageContainer = itemView.findViewById(R.id.imageContainer);
textContainer = itemView.findViewById(R.id.textContainer);
videoContainer = itemView.findViewById(R.id.videoContainer);
context = itemView.getContext();
// Header
name_post = itemView.findViewById(R.id.tName);
userId = itemView.findViewById(R.id.tUserId);
profileImg = itemView.findViewById(R.id.iCircleUserImg);
ib_more = itemView.findViewById(R.id.ib_more);
lHeader2 = itemView.findViewById(R.id.lHeader2);
// Footer
time_post = itemView.findViewById(R.id.tTime);
privacyBtn = itemView.findViewById(R.id.iPrivacy);
iHeart = itemView.findViewById(R.id.iHeart);
tLiked = itemView.findViewById(R.id.tLiked);
tViewCount = itemView.findViewById(R.id.tViewCount);
tComment = itemView.findViewById(R.id.tComment);
// TextHolder
tRawText = itemView.findViewById(R.id.detail_text_type);
// ImageHolder
recyclerView = itemView.findViewById(R.id.imageRecyclerForum);
indicator = itemView.findViewById(R.id.indicator);
stTextView = itemView.findViewById(R.id.stTextView);
//iRL=itemView.findViewById(R.id.lIRL);
//Video Container
}
public static TimelineViewHolder createViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(LAYOUT_RES, parent, false);
final TimelineViewHolder viewHolder;
switch (viewType) {
case TimelineAdapter.TYPE_IMAGE:
viewHolder = new TimelineViewHolder(view);
break;
case TimelineAdapter.TYPE_VIDEO:
viewHolder = new TimelineVideoViewHolder(view);
break;
default:
throw new IllegalArgumentException("Non supported view type: " + viewType);
}
return viewHolder;
}
public void setClickListener(View.OnClickListener clickListener) {
this.itemView.setOnClickListener(clickListener);
}
public void bind(TimelineAdapter timelineAdapter, TimelineViewHolder holder,
ForumHelper item, Object o) {
new Header(holder, item, itemView.getContext());
new Footer(holder, item, itemView.getContext());
holder.imageContainer.setVisibility(View.VISIBLE);
holder.textContainer.setVisibility(View.GONE);
holder.videoContainer.setVisibility(View.GONE);
if(item.getType().equals(kMap.image)){
new ImageHolder(holder, item, itemView.getContext());
}
}
public void onRecycled() {
}
}
**
VideoViewHolder
** class TimelineVideoViewHolder extends TimelineViewHolder implements ToroPlayer {
private static final String TAG = "TimelineVideoViewHolder";
private final Playable.EventListener listener = new Playable.DefaultEventListener() {
@OverRide
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
super.onPlayerStateChanged(playWhenReady, playbackState);
tPlayerState.setText(format(Locale.getDefault(), "STATE: %d・PWR: %s", playbackState, playWhenReady));
}
};
@nullable
private ExoPlayerViewHelper helper;
@nullable
private Uri mediaUri;
private String val;
//Video Holder
public PlayerView playerView;
public TextView tPlayerState;
public TimelineVideoViewHolder(View itemView) {
super(itemView);
playerView = itemView.findViewById(R.id.playerView);
tPlayerState = itemView.findViewById(R.id.player_state);
imageContainer.setVisibility(View.GONE);
textContainer.setVisibility(View.GONE);
videoContainer.setVisibility(View.VISIBLE);
val="/////////////////////////////////";
Log.e(TAG, "TimelineVideoViewHolder: ");
}
@Override
public void bind(TimelineAdapter timelineAdapter, TimelineViewHolder holder,
ForumHelper item, Object o) {
super.bind(timelineAdapter, holder, item, o);
mediaUri = Uri.parse(item.getMedia_url());
Log.d(TAG, "bind: "+mediaUri);
}
@NonNull
@Override
public View getPlayerView() {
return this.playerView;
}
@NonNull
@Override
public PlaybackInfo getCurrentPlaybackInfo() {
return helper != null ? helper.getLatestPlaybackInfo() : new PlaybackInfo();
}
@Override
public void initialize(@NonNull Container container, @NonNull PlaybackInfo playbackInfo) {
Log.e(TAG, "initialize: " + val);
if (mediaUri == null) throw new IllegalStateException("mediaUri is null.");
if (helper == null) {
helper = new ExoPlayerViewHelper(this, mediaUri);
helper.addEventListener(listener);
}
helper.initialize(container, playbackInfo);
}
@Override
public void play() {
if (helper != null) helper.play();
}
@Override
public void pause() {
if (helper != null) helper.pause();
}
@Override
public boolean isPlaying() {
return helper != null && helper.isPlaying();
}
@Override
public void release() {
if (helper != null) {
helper.removeEventListener(listener);
helper.release();
helper = null;
}
}
@Override
public boolean wantsToPlay() {
return ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= 0.85;
}
@Override
public int getPlayerOrder() {
return getAdapterPosition();
}
}
**