添加新项目时如何停止recyclerview自动刷新firebase实时数据库

how to stop recyclerview automatic refresh when a new item added firebase Realtime database

嘿,我正在制作一个具有上传 Instagram 卷轴(如视频)功能的应用程序,我在回收站视图中设置了 exoplayer,但是当另一个用户添加新数据或用户上传新卷轴时,回收站视图会自动刷新另一部手机,所有视频都卡住了,请帮助这是我的代码

public class NotificationFragemt extends Fragment implements Player.EventListener {
    private RecyclerView recyclerView;
    List<ModelVideos> videosList;
    int currentPage=-1;
    LinearLayoutManager layoutManager;
    boolean is_user_stop_video=false;
    VideoAdapter videoAdapter;
    private CardView plus_card;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_notification_fragemt, container, false);
//        getActivity().getWindow().setStatusBarColor(getActivity().getColor(R.color.black));

        // Inflate the layout for this fragment
        recyclerView = view.findViewById(R.id.videorecyclerview);
        videosList = new ArrayList<>();
        layoutManager=new LinearLayoutManager(getContext());
        recyclerView.setHasFixedSize(false);

        plus_card = view.findViewById(R.id.plus_card);

        plus_card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(getContext(), Upload_reels.class);
                startActivity(intent);

            }
        });





//        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,true);
//        layoutManager.setStackFromEnd(true);
//        layoutManager.setReverseLayout(true);

        recyclerView.setLayoutManager(layoutManager);
        SnapHelper snapHelper =  new PagerSnapHelper();
        snapHelper.attachToRecyclerView(recyclerView);
        Collections.shuffle(videosList);

         videoAdapter = new VideoAdapter(getActivity(),videosList);
        loadpost();




        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

            }
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //here we find the current item number
                final int scrollOffset = recyclerView.computeVerticalScrollOffset();
                final int height = recyclerView.getHeight();
                int page_no=scrollOffset / height;
                if(page_no!=currentPage ){
                    currentPage=page_no;
                    Release_Previous_Player();
                    Set_Player(currentPage);

                }
            }
        });





        return view;



    }

    SimpleExoPlayer privious_player;
    public void Release_Previous_Player(){
        if(privious_player!=null) {
            privious_player.removeListener(this);
            privious_player.release();
        }
    }

    private void loadpost() {

        DatabaseReference ref;

        ref = FirebaseDatabase.getInstance().getReference("TravelReels");
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                videosList.clear();
                for (DataSnapshot ds : snapshot.getChildren()){
                    ModelVideos modelPost = ds.getValue(ModelVideos.class);



                    videosList.add(modelPost);

                    Collections.reverse(videosList);
                    Collections.shuffle(videosList);



















                }


                setAdapter();







            }



            @Override
            public void onCancelled(@NonNull DatabaseError error) {

                Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });








    }

    private void setAdapter() {
        if (!videoAdapter.hasObservers()) {
            videoAdapter.setHasStableIds(true);
        }
        recyclerView.setAdapter(videoAdapter);



    }

    public boolean is_fragment_exits(){
        FragmentManager fm = getActivity().getSupportFragmentManager();
        if(fm.getBackStackEntryCount()==0){
            return false;
        }else {
            return true;
        }

    }

    public void Set_Player(int currentPage){

        try {
            LoadControl loadControl = new DefaultLoadControl.Builder()
                    .setAllocator(new DefaultAllocator(true, 16))
                    .setBufferDurationsMs(1 * 1024, 1 * 1024, 500, 1024)
                    .setTargetBufferBytes(-1)
                    .setPrioritizeTimeOverSizeThresholds(true)
                    .createDefaultLoadControl();


            DefaultTrackSelector trackSelector = new DefaultTrackSelector();
            final SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);

            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(),
                    Util.getUserAgent(getContext(), getContext().getResources().getString(R.string.app_name)));

            Log.d("video_url"+currentPage,videosList.get(currentPage).getVideoUrl());

            MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                    .createMediaSource(Uri.parse(videosList.get(currentPage).getVideoUrl()));

       /* MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(Uri.parse(proxyUrl));

            Log.d(Variables.tag,item.video_url);
            Log.d(Variables.tag,proxyUrl);*/


            player.prepare(videoSource);

            player.setRepeatMode(Player.REPEAT_MODE_ALL);
            player.addListener(this);


            View layout = layoutManager.findViewByPosition(currentPage);
            final PlayerView playerView = layout.findViewById(R.id.reels_player);
            playerView.setPlayer(player);
             player.setPlayWhenReady(is_visible_to_user);
            privious_player = player;
        }
        catch (Exception e){

        }


    }

    boolean is_visible_to_user;
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        is_visible_to_user=isVisibleToUser;

        if(privious_player!=null && (isVisibleToUser && !is_user_stop_video)){
            privious_player.setPlayWhenReady(true);
        }
        else if(privious_player!=null && !isVisibleToUser){
            privious_player.setPlayWhenReady(false);
        }

    }


    @Override
    public void onResume() {
        super.onResume();
        is_visible_to_user = true;
        if((privious_player!=null && (!is_user_stop_video)) && !is_fragment_exits() ){
            privious_player.setPlayWhenReady(true);
        }
    }



    @Override
    public void onPause() {
        super.onPause();
        if(privious_player!=null){
            privious_player.setPlayWhenReady(false);
        }
    }


    @Override
    public void onStop() {
        super.onStop();
        if(privious_player!=null){
            privious_player.setPlayWhenReady(false);
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        if(privious_player!=null){
            privious_player.release();
        }
    }

    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

    }

    @Override
    public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

    }

    @Override
    public void onLoadingChanged(boolean isLoading) {

    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

    }

    @Override
    public void onRepeatModeChanged(int repeatMode) {

    }

    @Override
    public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {

    }

    @Override
    public void onPositionDiscontinuity(int reason) {

    }

    @Override
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

    }

    @Override
    public void onSeekProcessed() {

    }
}

在您的 loadpost 函数中,您正在使用 addValueEventListener 每次 TravelReels 节点发生变化时它都会调用 onDataChange

如果您不希望它应该听取这些持续的变化。只加载一次数据。然后你可以使用 addListenerForSingleValueEvent ,它只会被调用一次。在这里阅读更多:https://firebase.google.com/docs/database/android/read-and-write#read_once_using_a_listener

但是如果你想自己控制它,那么只需添加一个布尔标志 shouldRefresh 根据你的需要将其设置为 true / false 并仅在它为 true 时通知适配器。写给你逻辑。