2017-01-19 19 views
2

私のアプリには、割り当てルートのリストがあります。ルートはウェブから割り当てられました。ビューがプルダウンされた後、リストが更新されました。しかし、私がプルダウンするたびに、拡大を見る。スワイプを追加して動的リストのレイアウトを更新する

これは、リフレッシュするためにスワイプを適用する前に、私のスクリーンショットです:

enter image description here

これは、リフレッシュするためにスワイプを適用した後、私のスクリーンショットです:

enter image description here

Viewがプルダウン後に毎回継続的に拡大しますスワイプしてリフレッシュするビュー。

は、これは私がSwipeRefreshLayoutでレイアウトファイルを含める方法です:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout  
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginEnd="10dp" 
    android:layout_marginStart="10dp" 
    android:layout_marginTop="10dp" 
    android:background="?android:attr/selectableItemBackground" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context=".ui.activities.RoutesAssignActivity"> 

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/swipeToRefreshLayoutId" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/md_white_1000" 
     android:scrollbars="vertical" /> 
</android.support.v4.widget.SwipeRefreshLayout> 


</RelativeLayout> 

これは私のAPI呼び出しです:

void getRoutes() { 

    Log.e("getRoutes", "=======getRoutes======== "); 



    final ApiService service = RestClient.getClient(); 
    Call<ApiResponse> signedIn = service.getRoutesApi(getPreference().getToken()); 
    signedIn.enqueue(new Callback<ApiResponse>() { 
     @Override 
     public void onResponse(Response<ApiResponse> response) { 
      if (response.isSuccess()) { 
       ApiResponse result = response.body(); 

       //error handling 
       if (result.getData() != null && result.getData().getRoutesList() != null) { 
        dialog.dismiss(); 
        emptyHistory.setVisibility(View.GONE); 
        historyView.setVisibility(View.VISIBLE); 
        routesDatas = result.getData().getRoutesList(); 
        setupRecyclerView(routesDatas); 
       } else if (result.getMsg().equalsIgnoreCase("Invalid token or Token has expired")) { 
        getPreference().removeLoginPreferences(); 
        Intent intent = new Intent(RoutesAssignActivity.this, LoginActivity.class); 
        finish(); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
        overridePendingTransition(0, 0); 
        startActivity(intent); 
       } else { 
        dialog.dismiss(); 
        emptyHistory.setVisibility(View.VISIBLE); 
        historyView.setVisibility(View.GONE); 
       } 
      } else { 
       // response received but request not successful (like 400,401,403 etc) 
       //Handle errors 
       dialog.dismiss(); 
       Snackbar.make(findViewById(android.R.id.content), 
         response.message(), Snackbar.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      dialog.dismiss(); 
      showNetworkSettings(); 
      Log.e("Errors :: getRoutes", "=======Status Code ======== " + t.getMessage()); 
     } 
    }); 
} 

割り当てルートここに更新し得る:onCreate方法でroutesDatas = result.getData().getRoutesList();

、私はgetRoutes()メソッドと呼びます:

if (getNetworkStatus()) { 
     getRoutes(); 
    } else { 
     showNetworkSettings(); 
    } 

IセットアップなどRecyclerView

void setupRecyclerView(List<RoutesList> routes) { 
    dialog.dismiss(); 
    FontIconTypefaceHolder.init(getAssets(), "fonts/MaterialIcons-Regular.ttf"); 

    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    stickyHeaderListAdapter = new StickyHeaderListAdapter(routes, this); 
    recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).build()); 
    final StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(stickyHeaderListAdapter); 
    recyclerView.addItemDecoration(headersDecor); 
    recyclerView.setAdapter(stickyHeaderListAdapter); 
} 

私はonCreate方法でSwipe to Refreshを適用するので、私はプルダウン時にビューには、毎回継続的に拡大します。

if (getNetworkStatus()) { 
     getRoutes(); 
     swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       getRoutes(); 
       swipeRefreshLayout.setEnabled(false); 
      } 
     }); 
    } else { 
     dialog.dismiss(); 
     showNetworkSettings(); 
    } 

ここでSwipe to Refreshを実装するにはどうすればよいですか?

+0

リフレッシュするたびにrecyclerViewを設定しないでください。項目を設定するためのアダプタでメソッドを作成し、 'notifyDataSetChanged()'を呼び出してください。 'recyclerView.setHasFixedSize(true);'はあなたのアイテムサイズが変わる可能性があるので必須ではありません。そしてあなたのレイアウトでは、すべてのウィジェットの高さとして 'match_parent'を使います。 –

+0

申し訳ありませんが、おかげで、私はそれを削除します。つまり、 'setupRecyclerView'メソッドで' notifyDataSetChanged'を使用します。 –

+0

ここでは、リスト画面で 'pull down to refresh 'を適用すると、ビューを展開するだけです。しかし、私はホーム画面からリスト画面に移動すると、表示がうまくいくように見えます。 –

答えて

1

はちょうどアダプタの項目を設定するためのアダプタでメソッドを作成し、notifyDataSetChanged()を呼び出し、あなたはリフレッシュRecyclerView毎回にアダプタを設定しないでください。もう1つの事はrecyclerView.setHasFixedSize(true);は必要ではありません。また、あなたのレイアウトでは、すべてのウィジェットの高さとしてmatch_parentを使用してください。

Like:
onCreate()でAPIを呼び出す前に、空のリストであるsetupRecyclerView(new ArrayList<RoutesList>());を呼び出してください。あなたのApapter


public void setItemsAndUpdateList(ArrayList<RoutesList> routes) { 
    //clear your old list 
    your_list.clear(); 
    //Add all new Items 
    your_list.addAll(routes); 
    notifyDataSetChanged(); 
} 

そして、あなたの代わりにgetRoutes()setupRecyclerView(routesDatas);を呼び出す、adapter.setItemsAndUpdateList(routesData);を呼び出すのようにメソッドを作成します。

+0

「アダプタ」は私の「アダプタクラス」を意味します。私は明確な説明と努力のためにこれをupvote。 –

+0

はいアダプタクラス –

関連する問題