2016-04-17 7 views
0

//次のように私は断片でRecycleViewを作成しました:validateToken方式のデータでフラグメントにRecyclerViewを作成しますが、データをリロードしている間にRecyclerViewは状態を維持しません。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_new_shop, container, false); 
     recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     stackView = (RelativeLayout) view.findViewById(R.id.stack_view); 
     firstStack = (CustomImageView) view.findViewById(R.id.firstStack); 
     secondStack = (CustomImageView) view.findViewById(R.id.secondStack); 
     thirdStack = (CustomImageView) view.findViewById(R.id.thirdStack); 
     stackTopGap = view.findViewById(R.id.view); 
     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       firstStack.getLayoutParams().width = stackView.getWidth() - 40; 
       secondStack.getLayoutParams().width = stackView.getWidth() - 80; 
       thirdStack.getLayoutParams().width = stackView.getWidth() - 120; 
       width = thirdStack.getLayoutParams().width; 
       recyclerView.getLayoutParams().height = recyclerView.getHeight() - (firstStack.getHeight() + stackTopGap.getHeight()); 
       stackView.getLayoutParams().height = firstStack.getHeight(); 
      } 
     }); 
     recyclerView.setHasFixedSize(true); 
     linearLayoutManager=new LinearLayoutManager(getActivity()) { 
      @Override 
      public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 
       // A good idea would be to create this instance in some initialization method, and just set the target position in this method. 
       LinearSmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) { 
        @Override 
        public PointF computeScrollVectorForPosition(int targetPosition) { 
         //int yDelta = calculateCurrentDistanceToPosition(targetPosition); 
         return new PointF(0, 200); 
        } 

        // This is the important method. This code will return the amount of time it takes to scroll 1 pixel. 
        // This code will request X milliseconds for every Y DP units. 
        @Override 
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
         return 7/TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 7, displayMetrics); 
        } 

       }; 
       smoothScroller.setTargetPosition(position); 
       startSmoothScroll(smoothScroller); 
      } 
     }; 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 

      @Override 
      public void onScrolled(final RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 
       final int positionView = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); 

       if (dy > 0) { 
        if (positionView >= 2) { 
         final View view = recyclerView.getChildAt(2); 
         if (view != null && recyclerView.getChildAdapterPosition(view) == positionView) { 
          TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 200, 0); 
          translateAnimation.setAnimationListener(new Animation.AnimationListener() { 
           @Override 
           public void onAnimationStart(Animation animation) { 
            if (counter == 0) { 
             if (recyclerView.getAdapter().getItemCount() - 4 >= positionView) { 
              createStackImageView(); 
             } 
             if (stackView.getChildAt(1) != null) { 
              //stackView.getChildAt(1).setScaleX(1.5f); 
             } 
             counter++; 
            } 
            recyclerView.smoothScrollToPosition(positionView); 
           } 

           @Override 
           public void onAnimationEnd(Animation animation) { 
            view.clearAnimation(); 
            stackView.requestLayout(); 
            stackView.removeView(stackView.getChildAt(1)); 
            stackView.invalidate(); 
            try { 
             for (int i = 1; i < 4; i++) { 
              Glide.with(getActivity()) 
                .load(JSONUrl.IMAGE_BASE_URL + imageList.get(positionView + i)) 
                .into((ImageView) stackView.getChildAt(i)); 
             } 
            } catch (IndexOutOfBoundsException | NullPointerException | IllegalArgumentException ex) { 
             ex.printStackTrace(); 
            } 
            counter = 0; 
           } 

           @Override 
           public void onAnimationRepeat(Animation animation) { 

           } 
          }); 
          translateAnimation.setDuration(150); 
          view.setAnimation(translateAnimation); 
         } 
        } 
        for (int i = stackView.getChildCount() - 1; i >= 2; i--) { 
         ResizeAnimation resizeAnimation = new ResizeAnimation(stackView.getChildAt(i)); 
         resizeAnimation.setHeights(stackView.getChildAt(i).getHeight(), stackView.getChildAt(i - 1).getHeight()); 
         resizeAnimation.setWidths(stackView.getChildAt(i).getWidth(), stackView.getChildAt(i - 1).getWidth()); 
         resizeAnimation.setDuration(200); 
         stackView.getChildAt(i).startAnimation(resizeAnimation); 
        } 
       } else if (dy < 0) { 
        final int position = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); 
        if (position == imageList.size() - 1) { 
         stackView.removeView(firstStack); 
         stackView.addView(firstStack); 
         stackView.invalidate(); 
         stackView.requestLayout(); 
         stackView.getChildAt(1).setVisibility(View.VISIBLE); 
         Glide.with(getActivity()) 
           .load(JSONUrl.IMAGE_BASE_URL + imageList.get(imageList.size() - 1)) 
           .into((ImageView) stackView.getChildAt(1)); 
        } else if (position == imageList.size() - 2) { 
         stackView.removeView(secondStack); 
         stackView.addView(secondStack); 
         secondStack.getLayoutParams().height = firstStack.getHeight() - 20; 
         secondStack.getLayoutParams().width = firstStack.getWidth() - 40; 
         stackView.invalidate(); 
         stackView.requestLayout(); 
         stackView.getChildAt(2).setVisibility(View.VISIBLE); 
         Glide.with(getActivity()) 
           .load(JSONUrl.IMAGE_BASE_URL + imageList.get(imageList.size() - 2)) 
           .into((ImageView) stackView.getChildAt(2)); 
        } else if (position == imageList.size() - 3) { 
         stackView.removeView(thirdStack); 
         stackView.addView(thirdStack); 
         thirdStack.getLayoutParams().height = secondStack.getHeight() - 20; 
         thirdStack.getLayoutParams().width = secondStack.getWidth() - 40; 
         stackView.invalidate(); 
         stackView.requestLayout(); 
         stackView.getChildAt(3).setVisibility(View.VISIBLE); 
         Glide.with(getActivity()) 
           .load(JSONUrl.IMAGE_BASE_URL + imageList.get(imageList.size() - 3)) 
           .into((ImageView) stackView.getChildAt(3)); 
        } else { 
         stackView.removeView(firstStack); 
         stackView.addView(firstStack); 
         stackView.invalidate(); 
         stackView.requestLayout(); 
        } 
       } 
      } 
     }); 
     return view; 
    } 

//は、JSONから採取され、次のようにアダプタに設定されています。次のように

private void validateToken() { 
     final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     if (new ConnectionManager(getActivity()).isConnectedToInternet()) { 
      final SweetAlertDialog pDialog = new AlertDIalogMessage().showProgressDialog(getActivity(), "Loading..."); 
      if (sharedPreferences.getString(SharedPrefrenceInfo.IS_TOKEN_VALID, "token_invalid").equals("token_invalid")) { 
       Utils.setTokenInfo(getActivity(), pDialog, new AccessTokenInfoHolder() { 
        @Override 
        public void setAcessTokenInfo(String accessToken, String expires_in, String token_type) { 
         Log.e("Access Token", accessToken); 
         new ShopFragmentJson(getActivity()).getShopPageContent(pDialog, sharedPreferences.getString(SharedPrefrenceInfo.TOKEN_TYPE, "") + " " + sharedPreferences.getString(SharedPrefrenceInfo.IS_TOKEN_VALID, ""), new ShopPageContentHolder() { 
          @Override 
          public void setErrorShopPageContent(String statusCode, String statusText) { 
           //do nothing here since the case unauthorized will not arrive for the first time 
          } 

          @Override 
          public void setSuccessShopPageContent(String success, String data) { 
           if (success.equals("true")) { 
            shoppageInfoList = getShopPageContent(data); 
            //set the adapter after loading data from url 
            final NewShopFragmentAdapter recyclerViewAdapter = new NewShopFragmentAdapter(getActivity(), recyclerView.getHeight(), shoppageInfoList); 
            recyclerView.setAdapter(recyclerViewAdapter); 
            pDialog.dismiss(); 
           } else { 
            pDialog.dismiss(); 
            new AlertDIalogMessage().showErrorDialog(getActivity(), data); 
           } 
          } 
         }); 
        } 
       }); 
      } else { 
       new ShopFragmentJson(getActivity()).getShopPageContent(pDialog, sharedPreferences.getString(SharedPrefrenceInfo.TOKEN_TYPE, "") + " " + sharedPreferences.getString(SharedPrefrenceInfo.IS_TOKEN_VALID, ""), new ShopPageContentHolder() { 
        @Override 
        public void setErrorShopPageContent(String statusCode, String statusText) { 
         //this method is invoked when unauthorized response come from server 
         Utils.setTokenInfo(getActivity(), pDialog, new AccessTokenInfoHolder() { 
          @Override 
          public void setAcessTokenInfo(String accessToken, String expires_in, String token_type) { 
           new ShopFragmentJson(getActivity()).getShopPageContent(pDialog, sharedPreferences.getString(SharedPrefrenceInfo.TOKEN_TYPE, "") + " " + sharedPreferences.getString(SharedPrefrenceInfo.IS_TOKEN_VALID, ""), new ShopPageContentHolder() { 
            @Override 
            public void setErrorShopPageContent(String statusCode, String statusText) { 
             //do nothing here since the case unauthorized will not arrive for the first time 
            } 

            @Override 
            public void setSuccessShopPageContent(String success, String data) { 
             if (success.equals("true")) { 
              List<ShoppageInfo> shoppageInfoList = getShopPageContent(data); 
              final NewShopFragmentAdapter recyclerViewAdapter = new NewShopFragmentAdapter(getActivity(), recyclerView.getHeight(), shoppageInfoList); 
              recyclerView.setAdapter(recyclerViewAdapter); 
              pDialog.dismiss(); 
             } else { 
              pDialog.dismiss(); 
              new AlertDIalogMessage().showErrorDialog(getActivity(), data); 
             } 
            } 
           }); 
          } 
         }); 
        } 

        @Override 
        public void setSuccessShopPageContent(String success, String data) { 
         if (success.equals("true")) { 
          List<ShoppageInfo> shoppageInfoList = getShopPageContent(data); 
          //set the adapter after loading data from url 
          final NewShopFragmentAdapter recyclerViewAdapter = new NewShopFragmentAdapter(getActivity(), recyclerView.getHeight(), shoppageInfoList); 
          recyclerView.setAdapter(recyclerViewAdapter); 
          pDialog.dismiss(); 
         } else { 
          pDialog.dismiss(); 
          new AlertDIalogMessage().showErrorDialog(getActivity(), data); 
         } 
        } 
       }); 
      } 
     } else { 
      new SweetAlertDialog(getActivity(), SweetAlertDialog.ERROR_TYPE) 
        .setTitleText("Oops...") 
        .setContentText("No internet connection!") 
        .show(); 
     } 
    } 

いいえonResumeメソッドで私が検証トークンと呼ばれる:

@Override 
    public void onResume() { 
     super.onResume(); 
     validateToken(); 
    } 

//私はこの断片から、いくつかのアクティビティを呼び出し、押し戻さvalidateメソッドが呼び出されRecy​​clerViewアダプタがあるされて戻ってきたときにリロードされました。今私が欲しいのは、RecyclerViewの状態を維持して、アクティビティからRecyclerViewが戻ったときに、アクティビティが呼び出されたときのスクロール位置にとどまるようにすることです。しかし、私にとっての問題は、常に最初から来るということです。私はまたいくつかのスタックオーバーフローポストを参照してください、彼らは私がParceableを使用するように示唆するが、私は何の利益を得ることはありません。何もしていない。

答えて

0

これを試すことができます。 各行の識別子を保持する必要があります。その後、アクティビティに行く前に、最初に表示されている行の識別子を保存します。その後、あなたが戻ったときに、その特定の行を再び選択します。

関連する問題