如何解决在 recyclerview 适配器中自动播放音乐和视频
我在一个片段中有 2 个 recycler view
。第一次垂直滚动,第二次水平滚动在第一个内。(就像 Instagram 应用程序一样)。回收器视图一次显示一项,我使用 PagerSnapHelper
一次滚动一项。 In 2nd recycler view,I am displaying an image and playing a song from url
。我想在滚动到下一个/上一个项目(水平和垂直)后自动播放歌曲。当用户点击图像时歌曲停止,如果再次点击则歌曲再次开始。
在完成歌曲播放工作后,我也希望视频播放器具有相同的逻辑。
在这里,我遇到了自动播放歌曲的问题。 Sometime song is playing for next item instead of current visible item.
有一段时间歌曲和图像都可以正常工作,并且在下一次滚动之后突然歌曲开始从下一个尚不可见的项目开始播放。还有if user click on image than song stop and when click again than song is playing properly
我在 onBindViewHolder
中记录并检查了第一个回收者视图中的位置编号,它记录了 2 次。对于当前滚动的一个和下一个项目也是如此。
我尝试了很多不同的方法来修复它
将可回收设置为 false holder.setIsRecyclable(false);
从 holder.getLayoutPosition()
获取位置
使用 interfaces
等,但计数会弄清楚。
注意:我将 MediaPlayer
从 MainActivity 传递到 Fregment 到 1st
回收器视图到播放歌曲的第二个回收器视图。
这是我的主要代码结构
片段:
homeViewVerticalAdapter = new HomeViewVerticalAdapter(getActivity(),verticalDataModals,mp,...)
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false);
infiniteScrollListener = new InfiniteScrollListener(linearLayoutManager,this);
infiniteScrollListener.setLoaded();
recyclerView.setLayoutManager(linearLayoutManager);
SnapHelper snapHelper = new PagerSnapHelper();
recyclerView.setOnFlingListener(null);
snapHelper.attachToRecyclerView(recyclerView);
homeViewVerticalAdapter.setHasStableIds(true);
// to disable caching so auto song play on all items
recyclerView.getRecycledViewPool().clear();
recyclerView.setItemViewCacheSize(0);
recyclerView.setAdapter(homeViewVerticalAdapter);
我在 recyclerView.addOnScrollListener
内登录,在 public void onScrolled(RecyclerView recyclerView,int dx,int dy) {
内显示 2 个日志。
第一个回收器视图(垂直滚动)
@Override
public void onBindViewHolder(@NonNull HomeViewVerticalAdapter.HomeViewHolder holder,int position) {
if (holder instanceof DataViewHolder) {
final VerticalDataModal verticalDataModal = verticalDataModalList.get(position);
HomeViewHorizontalAdapter homeViewHorizontalAdapter = null;
homeViewHorizontalAdapter = new HomeViewHorizontalAdapter(context,postViewItem,...)
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false));
SnapHelper snapHelper = new PagerSnapHelper();
holder.recyclerView.setOnFlingListener(null);
snapHelper.attachToRecyclerView(holder.recyclerView);
homeViewHorizontalAdapter.setHasStableIds(true);
holder.recyclerView.setAdapter(null);
holder.recyclerView.getRecycledViewPool().clear();
holder.recyclerView.setItemViewCacheSize(0);
holder.recyclerView.setAdapter(homeViewHorizontalAdapter);
homeViewHorizontalAdapter.notifyDataSetChanged();
......
....
}
}
第二个回收器视图(水平滚动)
@Override
public void onBindViewHolder(@NonNull HomeViewHorizontalAdapter.HomeViewHolder holder,int position) {
if (holder instanceof DataViewHolder) {
String musicPath = horizontalData1modal.getMusicUrl();
String imagePath = horizontalData1modal.getImageUrl();
Picasso.get()
.load(imagePath)
.placeholder(R.drawable.influencers)
.error(R.drawable.influencers)
.into(holder.imagePreviewLocal);
// playing fine when click on layout
holder.contentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
musicPlayer(musicPath,"click",holder);
}
});
// not playing from auto play
musicPlayer(musicPath,"auto",holder);
......
....
}
}
在第二个回收器视图(水平滚动)中思考播放方法:
注意:这里播放音乐,加载并在一段时间后隐藏布局
private void musicPlayer(String musicPath,String playType,@NonNull HomeViewHorizontalAdapter.HomeViewHolder holder) {
try {
Log.d(TAG,"music player detected: "+playType);
holder.contentDataLayout.setVisibility(View.VISIBLE);
if(timerMusicTrack != null){
timerMusicTrack.cancel();
}
if ((!mediaplayer.isPlaying() || playType.equals("auto")) && musicPath != null && !musicPath.equals("")) {
isPlaying = true;
mediaplayer.reset();
mediaplayer.stop();
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Uri musicUri = Uri.parse(musicPath);
mediaplayer.setDataSource(context,musicUri);
mediaplayer.prepareAsync();
progressBarLocal.setVisibility(View.VISIBLE);
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp,int what,int extra) {
if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END){
progressBarLocal.setVisibility(View.GONE);
return true;
} else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){
progressBarLocal.setVisibility(View.VISIBLE);
}
return false;
}
});
progressBarLocal.setVisibility(View.GONE);
mediaplayer.start();
timerMusicTrack = new CountDownTimer(delayMillis,100) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
timerUsed = true;
holder.contentDataLayout.setVisibility(View.GONE);
}
};
timerMusicTrack.start();
}
});
} else {
isPlaying = false;
mediaplayer.reset();
mediaplayer.stop();
progressBarLocal.setVisibility(View.GONE);
}
} catch (IOException e) {
e.printStackTrace();
progressBarLocal.setVisibility(View.GONE);
}
}
如何为当前可见的项目自动播放歌曲?我错过了什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。