如何在RecyclerView Adapter项中切换OnClickListener来构建对象的Arraylist

问题描述 投票:0回答:2

我正在构建一个Android媒体应用程序,并尝试添加播放列表功能,用户将能够创建自己的播放列表并进行修改。

我正在使用RecyclerView来显示用户可以选择的歌曲列表。问题是我不明白如何将所选歌曲的Arraylist从适配器传递给片段。我试过使用Observer模式,但不知道如何使用该信息。

这是我创建播放列表的片段:

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);
}

我知道这是很多代码,但我只是不明白如何将数据从适配器传递回片段......

android android-fragments android-recyclerview recycler-adapter observer-pattern
2个回答
0
投票

我不明白你到底想要做什么。该代码包含几个我将尝试解释的错误。

您所做的一个明显错误仍然是onBindViewholder,您在创建每个项目时调用该侦听器而不是单击它之后。您只需在viewHolder.getItemView()或viewholder的特定视图中添加onClickListener,然后执行单击项目后需要执行的操作。如果在onBindViewHolder中设置了一个监听器,那么你还可以使用一个名为holder.getAdapterPosition()的方法来了解你点击的是哪个项目。

视图持有者应仅用于根据您绑定的数据设置视图,而不是其他任何内容。因此,您不应将任何对象或侦听器传递给它,而应使用上述方法。

如果您只是在用户确认其播放列表后检索所选歌曲,您只需在适配器上添加公共方法

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的一部分,并相应地更新视图。


0
投票

您可以使用回调方法。维护数组列表中所选项目的列表,并在单击完成按钮时发送回片段,或者为完成操作放置任何其他按钮。跟着这些步骤

- 使用list参数创建一个接口。

-Fragment应该实现这个接口。

- 然后在初始化Recyclerview适配器时传递此接口对象。

- 单击完成后,调用此接口的重写方法并将选定的歌曲列表作为参数发送。

© www.soinside.com 2019 - 2024. All rights reserved.