代码之家  ›  专栏  ›  技术社区  ›  Matthew Miranda

如何在片段内的CardView上实现SwipeRefreshLayout?

  •  0
  • Matthew Miranda  · 技术社区  · 7 年前

    最近的新闻片段。Java语言

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        final String TAG = "MainPageActivity";
    
        final RecyclerView rvNewsArticle;
    
        final SwipeRefreshLayout swipeRefreshLayout;
    
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_recent_news, container, false);
    
        rvNewsArticle = (RecyclerView) view.findViewById(R.id.rvNewsArticle);
        rvNewsArticle.setHasFixedSize(true);
        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        rvNewsArticle.setLayoutManager(manager);
    
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.primaryColor, R.color.primaryTextColor, R.color.secondaryColor);
    
        String url = "http://192.168.0.29/theflare/app/news.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
            url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.d(TAG, response);
    
                    ArrayList<News> newsList = new JsonConverter<News>()
                            .toArrayList(response, News.class);
    
                    final NewsArticleAdapter adapter = new NewsArticleAdapter(getActivity(), newsList);
    
                    rvNewsArticle.setAdapter(adapter);
    
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    rvNewsArticle.setAdapter(adapter);
                                    swipeRefreshLayout.setRefreshing(false);
                                }
                            }, 2500);
                        }
                    });
    
                }
            }
        );
    
        MySingleton.getInstance(getActivity()).addToRequestQueue(stringRequest);
    
        return view;
    }
    

    正如你所见,这是我为我的 CardView . 不幸的是,我的 SwipeRefreshLayout 不起作用。(它可以工作,但仅限于动画,不会刷新视图。)我把 setOnRefreshListener 在错误的地方还是我只是错过了什么?谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bryan    7 年前

    您的回调方法位于错误的位置。您应该在 onRefresh() 方法,而不是相反。

    private static final String NEWS_URL = "http://192.168.0.29/theflare/app/news.php";
    
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private RecyclerView mRecyclerView;
    
    @Override
    public view onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    
        // ...
    
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                loadNews();
            }
        });
    
        return view;
    }
    
    private void loadNews() {
        StringRequest request = new StringRequest(Request.Method.GET, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    ArrayList<News> newsList = new JsonConverter<News>().toArrayList(response, News.class);
                    NewsArticleAdapter adapter = new NewsArticleAdapter(getActivity(), newsList);
                    mRecyclerView.setAdapter(adapter);
    
                    mSwipeRefreshLayout.setRefreshing(false);
                }
            });
        MySingleton.getInstance(getActivity()).addToRequestQueue(request);
    }