2017-10-08 46 views
0

我们正在为android做一个MusicPlayer作为项目。我们有3个选项卡 - 歌曲(显示手机上的所有歌曲),正在播放(应显示当前入队的歌曲)和播放列表。RecyclerView不可视化/更新

入队歌曲不会出现在NowPlayingFragment中。 我为当前入队歌曲实施了RecyclerView。歌曲通过SongsRecyclerAdapter(处理“歌曲”选项卡中的列表)排入队列。我使用MusicProvider类中的静态addToQueue()方法,它将歌曲添加到列表currentQueue(在同一个类中) 中,并且紧接着来自适用于入队列表的NotifyDataSetChanged()。 适配器本身对其项目使用相同的List currentQueue。 这里是我的enqueueAdapter

public class NowPlayingRecyclerAdapter extends RecyclerView.Adapter<NowPlayingRecyclerAdapter.ViewHolder>{ 
private Context context; 
public List<MediaMetadataCompat> mSongs; 
private LayoutInflater inflater; 
public NowPlayingRecyclerAdapter(Context context,List<MediaMetadataCompat> songs){ 
    this.context = context; 
    this.mSongs = songs; 
    this.inflater = LayoutInflater.from(context); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.song_item,parent,false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    MediaMetadataCompat currentSong = mSongs.get(position); 
    holder.setData(currentSong,position); 
    holder.setListeners(); 
} 

private void removeSongFromQueue(int position) { 
    mSongs.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position,getItemCount()); 
} 

@Override 
public int getItemCount() { 
    return mSongs.size(); 
} 

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    LinearLayout item; 
    TextView title; 
    TextView artist; 
    ImageView deleteIcon; 
    int position; 
    MediaMetadataCompat current; 
    ImageView dotsIcon; 

    private ViewHolder(View itemView) { 
     super(itemView); 
     this.item = (LinearLayout) itemView.findViewById(R.id.song_item); 
     this.artist = (TextView) itemView.findViewById(R.id.artist); 
     this.title = (TextView) itemView.findViewById(R.id.title); 
     this.deleteIcon = (ImageView) itemView.findViewById(R.id.img_delete); 
     this.dotsIcon = (ImageView) itemView.findViewById(R.id.img_dots); 
     dotsIcon.setVisibility(View.GONE); 
    } 

    private void setData(MediaMetadataCompat currentSong, int position) { 
     this.current = currentSong; 
     this.title.setText(currentSong.getDescription().getTitle()); 
     this.artist.setText(currentSong.getDescription().getSubtitle()); 
     this.position = position; 
    } 

    private void setListeners() { 
     deleteIcon.setOnClickListener(ViewHolder.this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.img_delete) { 
      removeSongFromQueue(position); 
      //removeSongFromPlaylistFile(); 
     } 
    } 

} 

,这里是我的NowPlaingFragment(用于排队)

public class NowPlayingFragment extends Fragment { 

public static NowPlayingRecyclerAdapter adapter; 
private Context context; 
public static List<MediaMetadataCompat> songs; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.now_playing_fragment, container, false); 

    context = getActivity(); 
    songs = MusicProvider.getCurrentQueue(); 
    context = getActivity(); 

    setUpRecyclerView(view); 

    return view; 
} 

private void setUpRecyclerView(View view) { 
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_queue); 
    recyclerView.setHasFixedSize(true); 
    adapter = new NowPlayingRecyclerAdapter(context,songs); 
    //adapter = new SongsRecyclerAdapter(view.getContext(),songs,true); 
    recyclerView.setAdapter(adapter); 

    LinearLayoutManager myLinearLayoutManager = new LinearLayoutManager(view.getContext()); 
    myLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(myLinearLayoutManager); 
    recyclerView.addItemDecoration(new DividerItemDecoration(context, myLinearLayoutManager.getOrientation())); 
} 

这是我在点击监听器做排队歌曲

MusicProvider.addToQueue(songs.get(getAdapterPosition()) 
             .getMediaId()); 
    NowPlayingRecyclerAdapter myAdapter = NowPlayingFragment.adapter; 

           myAdapter.notifyDataSetChanged(); 

重要MusicProvider类中的内容:

public static void addToQueue(String mediaId) { 
    if (currentQueue == null) 
     currentQueue = new ArrayList<>(); 
    currentQueue.add(getSong(mediaId)); 
} 
public static List<MediaMetadataCompat> getCurrentQueue() { 
    return currentQueue != null ? currentQueue : Collections.<MediaMetadataCompat>emptyList(); 
} 

回答

0

从适配器和片段内的歌曲中删除静态。 MediaProvider也充满了静态。 您应该通过实例名称来引用或创建单例,并通过getInstance进行引用。

+0

我知道这是不好的做法,但是这是什么真正让我回收未显示其项目? –

+0

它可以造成很多麻烦。特别是使用Recyclerview数据(容易出现问题)。 – Shmuel

0

就叫

notifyDataSetChanged(); 
or 
notifyItemChanged(position);