我正在构建一个Android媒体应用,并尝试向其中添加播放列表功能,因此用户将能够创建自己的播放列表并对其进行修改。
我正在使用RecyclerView来显示用户可以选择的歌曲列表。 问题是我不明白如何将所选歌曲的数组列表从适配器传递到片段。 我尝试使用观察者模式,但是不知道如何使用该信息。
这是我创建播放列表的片段:
public class CreatePlaylistFragment extends Fragment implements PlaylistAdapterInterface {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_create_playlist, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ArrayList<ProgramsData> dataArrayList = ProgramsReceiver.getPrograms();
ArrayList<ProgramsData> sortedList = new ArrayList<>(dataArrayList);
adapter = new CreatePlaylistAdapter(dataArrayList, view.getContext(), this);
adapter.adapterInterface = this;
ivCreatePlaylist.setOnClickListener(v -> {
Toast.makeText(v.getContext(), "Creating Playlist!", Toast.LENGTH_SHORT).show();
new PlaylistsJsonWriter(playlistArrayList,getContext()).execute();
});
}
@Override
public void OnItemClicked(ArrayList<ProgramsData> programs) {
programsToCreate = programs;
String s = etListName.getText().toString();
playlistArrayList.add(new Playlist(s, programsToCreate));
}
}
这是将ViewHolder作为内部类的Recycler Adapter:
public class CreatePlaylistAdapter extends RecyclerView.Adapter<CreatePlaylistViewHolder> {
List<ProgramsData> programsDataList;
Context context;
public PlaylistAdapterInterface adapterInterface = null;
public CreatePlaylistAdapter(List<ProgramsData> programsDataList, Context context , PlaylistAdapterInterface adapterInterface) {
this.programsDataList = programsDataList;
this.context = context;
this.adapterInterface = adapterInterface;
}
@NonNull
@Override
public CreatePlaylistViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.chose_program_to_playlist_item, viewGroup, false);
return new CreatePlaylistViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CreatePlaylistViewHolder holder, int i) {
ProgramsData programsData = programsDataList.get(i);
holder.tvProgramName.setText(programsData.getProgramName());
if (programsData.getStudentName() != null)
holder.tvStudentName.setText(programsData.getStudentName());
else holder.tvLine.setText(""); //if there is no student the line won't be printed
holder.ivProfilePic.setImageResource(programsData.getProfilePic());
holder.programsData = programsData;
// holder.mAdapterInterface = adapterInterface;
adapterInterface.OnItemClicked(holder.programs);
}
@Override
public int getItemCount() {
return programsDataList.size();
}
}
class CreatePlaylistViewHolder extends RecyclerView.ViewHolder {
TextView tvProgramName;
TextView tvStudentName;
TextView tvLine;
CircleImageView ivProfilePic;
ToggleButton tbCheck;
ProgramsData programsData;
ArrayList<ProgramsData> programs;
PlaylistAdapterInterface mAdapterInterface;
public CreatePlaylistViewHolder(@NonNull View itemView) {
super(itemView);
tvProgramName = itemView.findViewById(R.id.tvProgramName);
tvStudentName = itemView.findViewById(R.id.tvStudentName);
ivProfilePic = itemView.findViewById(R.id.ivProfilePic);
tvLine = itemView.findViewById(R.id.tvLine);
tbCheck = itemView.findViewById(R.id.tbCheck);
programs= new ArrayList<>();
tbCheck.setOnClickListener(v -> {
if (tbCheck.isChecked()) {
tbCheck.setBackgroundResource(R.drawable.ic_radio_button_checked);
programs.add(programsData);
} else if (!tbCheck.isChecked()) {
tbCheck.setBackgroundResource(R.drawable.ic_check);
programs.remove(programsData);
}
});
}
}
这是观察者模式的界面:
public interface PlaylistAdapterInterface {
void OnItemClicked(ArrayList<ProgramsData> programs);
}
我知道这是很多代码,但是我只是不明白如何将数据从适配器传递回片段...
答案 0 :(得分:0)
我不确定您要做什么。 该代码包含一些错误,我将尝试解释。
您所犯的一个明显错误停留在onBindViewholder上,您在其中创建每个项目时都调用了侦听器,而不是单击它之后。 您只需在viewHolder.getItemView()或视图持有者的特定视图中添加onClickListener,然后在单击项目后执行所需的操作。 如果您在onBindViewHolder中设置了一个侦听器,则还有一个方法 owner.getAdapterPosition(),可用于了解您单击的项目。
viewholder仅用于根据要绑定的数据来设置视图,而不能用于其他目的。因此,您不应将任何对象或侦听器传递给它,而应使用上面的方法。
如果您只是在用户确认播放列表后才检索选定的歌曲,则可以在适配器上添加公共方法
public List<ProgramsData> getSelectedSongs()
当用户单击确认按钮时可以从片段中调用。
要获得所有选定歌曲的列表,可以有另一个列表
ArrayList<ProgramsData> selectedPrograms;
点击后要填写的。 onBindViewHolder内的侦听器内容可能是
ProgramsData currentProgram = programs.get(holder.getAdapterPosition());
if(selectedPrograms.contains(currentProgram){
selectedPrograms.remove(currentProgram);
}else{
selectedPrograms.add(currentProgram);
}
notifyItemChanged(holder.getAdapterPosition); //You can use this to update the view of the selected item
然后在onBindViewHolderMethod内部,您可以检查所绑定的项目是否属于selectedList并相应地更新视图。
答案 1 :(得分:0)
您可以使用回调方法。维护数组列表中选定项目的列表,并在单击完成按钮或放置其他按钮以完成操作时发送回片段。 请按照以下步骤操作
-使用列表参数创建接口。
-Fragment应该实现此接口。
-然后在初始化Recyclerview适配器时传递此接口对象。
-单击完成后,将调用此接口的覆盖方法,并将选定的歌曲列表作为参数发送。