2017-11-13 28 views
0

RecentNewsFragment.javaフラグメント内のCardViewでSwipeRefreshLayoutを実装する方法は?

@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を間違った場所に置いたのですか、ここで何か不足していますか?助けてくれてありがとう。

+0

**問題**:あなただけ(アニメーションを示す)、それを更新していると '2.5'秒後にあなただけの' swipeRefreshLayout.setRefreshing(false)を使用してアニメーションを無効にします; 'しかし、'内部で実行一切要求がありませんでしたonRefresh'。したがって、実行依頼 'onRefresh' –

答えて

1

コールバックメソッドが間違った場所にあります。別の方法ではなく、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); 
} 
+0

これはうまくいきました!ありがとう!私は 'onCreateView'の中に' Fragment'で見えるように 'loadNews();'を入れなければなりませんでした。しかし全体的に、これは本当に大きな助けになりました。再度、感謝します! –

+0

@MatthewMiranda喜んで助けてください。 'onCreateView'の中に' loadView'コードを置いても問題ありません。私はコードを重複しないように分割しただけです(通常、最初にデータをロードしてデータを更新するために同じコードを呼び出すことになります)。 'Fragment'はあなたがこれをするのを妨げてはいけません。 – Bryan

関連する問題