android-fragments 是否在片段中使用SwipeRefreshLayout滑动以刷新数据?

blpfk2vs  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(142)

我希望我的布局在应用程序启动时刷新,数据应显示在中,当用户滑动时,数据应更新,并显示新数据(如果服务器上有新数据)。
实际的问题是,数据在应用程序启动时没有加载。而是只在滑动时发生。我如何才能实现在打开应用程序时先加载数据,然后在滑动时更新数据?

public class FirstFragment extends Fragment {
    FragmentFirstBinding binding;
    APIInterfaces interfaces;
    ArrayList<VideoModels> list = new ArrayList<>();
    @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragmentFirstBinding.inflate(inflater, container, false);
        MyAdapter adapter = new MyAdapter(list,getContext());
        binding.myRecyclerView.setAdapter(adapter);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
        binding.myRecyclerView.setLayoutManager(gridLayoutManager);
        interfaces = RetrofitInstance.getRetrofit().create(APIInterfaces.class);
        binding.swipeToRefresh.setRefreshing(true);
        binding.swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                interfaces.getPosts().enqueue(new Callback<List<VideoModels>>() {
                    @SuppressLint("NotifyDataSetChanged")
                    @Override
                    public void onResponse(@NonNull Call<List<VideoModels>> call, @NonNull Response<List<VideoModels>> response) {
                        list.clear();
                        if (response.isSuccessful()) {
                            assert response.body() != null;
                            list.addAll(response.body());
                            adapter.notifyDataSetChanged();
                            binding.swipeToRefresh.setRefreshing(false);
                        }
                    }

                    @Override
                    public void onFailure(@NonNull Call<List<VideoModels>> call, @NonNull Throwable t) {
                        Toast.makeText(getContext(), "Check you Internet", Toast.LENGTH_SHORT).show();
                        binding.swipeToRefresh.setRefreshing(false);
                    }
                });
            }
        });
        binding.swipeToRefresh.setRefreshing(false);

        return binding.getRoot();
    }
}

EDIT-1:已添加完整代码。

你的回答对我有帮助。

cdmah0mi

cdmah0mi1#

您需要在onResume()状态下调用此方法

public void getData() {
            interfaces.getPosts().enqueue(new Callback<List<VideoModels>>() {
                @SuppressLint("NotifyDataSetChanged")
                @Override
                public void onResponse(@NonNull Call<List<VideoModels>> call, @NonNull Response<List<VideoModels>> response) {
                    list.clear();
                    if (response.isSuccessful()) {
                        assert response.body() != null;
                        list.addAll(response.body());
                        adapter.notifyDataSetChanged();
                        binding.swipeToRefresh.setRefreshing(false);
                    }
                }

                @Override
                public void onFailure(@NonNull Call<List<VideoModels>> call, @NonNull Throwable t) {
                    Toast.makeText(getContext(), "Check you Internet", Toast.LENGTH_SHORT).show();
                    binding.swipeToRefresh.setRefreshing(false);
                }
            });
        }
nkhmeac6

nkhmeac62#

如果调用binding.swipeLayout.isRefreshing = true
在SwipeRefreshLayout源代码中,mNotify布尔值为false,因此无法在setOnRefreshListener中执行任何操作

public void onAnimationEnd(Animation animation) {
        if (mRefreshing) {
            // Make sure the progress view is fully visible
            mProgress.setAlpha(MAX_ALPHA);
            mProgress.start();
            if (mNotify) {
                if (mListener != null) {
                    mListener.onRefresh();
                }
            }
            mCurrentTargetOffsetTop = mCircleView.getTop();
        } else {
            reset();
        }
    }

这就是为什么不调用setOnRefreshListener原因,如果您希望手动调用它,请按如下方式操作:reflect set mNotify boolean value istrue

val swipeClass = SwipeRefreshLayout::class.java
val method = swipeClass.getDeclaredMethod("setRefreshing", Boolean::class.java, Boolean::class.java)
method.isAccessible = true
method.invoke(binding.swipeLayout, true, true)
gstyhher

gstyhher3#

在找到解决办法的1天后。终于,我找到了我的解决办法。
要使用SwipeRefreshLayout,请在Fragment中工作,并希望刷新您的数据Onswipe。使用下面的代码,并根据您的需要修改它。
这是一个fragment

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragmentFirstBinding.inflate(inflater, container, false);
        // swiping on starting of an app.
        binding.swipeToRefresh.setRefreshing(true);
        getData();
        binding.swipeToRefresh.setRefreshing(false);

        // when user swipe
        binding.swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @SuppressLint("NotifyDataSetChanged")
            @Override
            public void onRefresh() {
                getData();
            }
        });
        return binding.getRoot();
    }
    public void getData(){
        // you have to put all of your onCreate code here to work properly. most of time it throws an error. So, make sure you added code properly.
        ArrayList<VideoModels> list = new ArrayList<>();
        MyAdapter adapter = new MyAdapter(list,getContext());
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
        binding.myRecyclerView.setAdapter(adapter);
        binding.myRecyclerView.setLayoutManager(gridLayoutManager);
        binding.swipeToRefresh.setRefreshing(true);
        interfaces = RetrofitInstance.getRetrofit().create(APIInterfaces.class);
        interfaces.getPosts().enqueue(new Callback<List<VideoModels>>() {
            @SuppressLint("NotifyDataSetChanged")
            @Override
            public void onResponse(@NonNull Call<List<VideoModels>> call, @NonNull Response<List<VideoModels>> response) {
                list.clear();
                if (response.isSuccessful()) {
                    assert response.body() != null;
                    list.addAll(response.body());
                    adapter.notifyDataSetChanged();
                    binding.swipeToRefresh.setRefreshing(false);
                }
            }
            @Override
            public void onFailure(@NonNull Call<List<VideoModels>> call, @NonNull Throwable t) {
                Toast.makeText(getContext(), "Check you Internet", Toast.LENGTH_SHORT).show();
                binding.swipeToRefresh.setRefreshing(false);
            }
        });
    }

相关问题