繁体   English   中英

setArguments() 在将数据传递给 Fragment 时不起作用

[英]setArguments() not working while passing data to Fragment

我是 Android 开发的新手,我正在尝试实现音乐播放器。 我试图实现一个片段,如果用户点击“删除”,则所选索引将从 ArrayList 中删除并从 RecyclerView 中消失。

当应用程序到达 onClick 匿名函数时,它在“位置”变量的分配处崩溃,指示“空指针异常”。

我将 MainActivity.java 和 DeleteFragment.java 附加到这个线程。 谢谢!


public class MainActivity extends AppCompatActivity {

    static ArrayList<SongModel> songModelArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView songsRV = findViewById(R.id.activity_main_recycler);
        songsRV.setHasFixedSize(true);
        songsRV.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        songModelArrayList = new ArrayList<SongModel>();
        songModelArrayList.add(new SongModel("Bob Dylan", "One More Cup Of Coffee", "https://www.syntax.org.il/xtra/bob.m4a", R.drawable.bob1));
        songModelArrayList.add(new SongModel("Bob Dylan", "Sara", "https://www.syntax.org.il/xtra/bob1.m4a", R.drawable.bob2));
        songModelArrayList.add(new SongModel("Bob Dylan", "The Man In Me", "https://www.syntax.org.il/xtra/bob2.mp3", R.drawable.bob3));

        SongAdapter songAdapter = new SongAdapter(this, songModelArrayList);

        ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP|ItemTouchHelper.DOWN, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                if(direction == ItemTouchHelper.RIGHT || direction == ItemTouchHelper.LEFT){

                    DeleteFragment deleteFragment = new DeleteFragment();
                    Bundle args = new Bundle();

                    args.putParcelableArrayList("arrayList", songModelArrayList);
                    int position = viewHolder.getAdapterPosition();
                    args.putInt("position", position);

                    deleteFragment.setArguments(args);

                    getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, 0, 0, R.anim.exit_from_left).add(R.id.fragment_container, new DeleteFragment(), null).addToBackStack("Delete").commit();

             
                }
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(songsRV);

        songsRV.setAdapter(songAdapter);

    }
}
public class DeleteFragment extends Fragment {

    public DeleteFragment() {
        // Required empty public constructor
    }

    public static DeleteFragment newInstance(ArrayList<SongModel> songs){
        DeleteFragment deleteFragment = new DeleteFragment();
        Bundle args = new Bundle();
        args.putParcelableArrayList("arrayList", songs);
        deleteFragment.setArguments(args);
        return deleteFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_delete, container, false);

        FloatingActionButton floatingActionButton = view.findViewById(R.id.exit_btn);
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

        MaterialButton cancelBtn = view.findViewById(R.id.cancel_btn);
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

        MaterialButton deleteBtn = view.findViewById(R.id.delete_btn);
        deleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Bundle args = getArguments();

                int position = args.getInt("position");

                ArrayList<SongModel> changedSongArrayList = getArguments().getParcelableArrayList("arrayList");
                changedSongArrayList.remove(position);
                changedSongArrayList.notifyAll();

                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

        return view;
    }
}

在线getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, 0, 0, R.anim.exit_from_left).add(R.id.fragment_container, new DeleteFragment(), null).addToBackStack("Delete").commit(); 您正在创建新的Deletefragment而不是使用已创建的带参数的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM