2016-04-17 6 views
0

// Ich habe in RecycleView Fragment wie folgt erstellt:Ich erstelle ein RecyclerView in Fragment, aber während des Datenladens behält RecyclerView den Status nicht bei.

@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; 
    } 

// In validateToken Verfahren Daten von dem json genommen wird und wie folgt festgelegt an Adapter.

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(); 
     } 
    } 

Nein in onResume Methode namens i Validate-Token wie folgt:

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

// Nun, wenn ich eine gewisse Aktivität von diesem Fragment rufen und wieder mit Rücken gedrückt Validate-Methode wird aufgerufen und RecyclerView Adapter neu geladen. Nun möchte ich den Zustand von RecyclerView beibehalten, so dass RecyclerView nach der Rückkehr aus der Aktivität in der Scroll-Position bleibt, wenn die Aktivität aufgerufen wird. Aber Problem für mich ist es immer von Anfang an. Ich sehe auch einige Stack Overflow Beiträge und sie empfehlen mir, Parceable zu benutzen, aber ich bekomme keinen Vorteil. Tut nichts.

Antwort

0

Kann dies versuchen. Sie müssen für jede Zeile einen Bezeichner pflegen. Speichern Sie dann die Kennung der ersten sichtbaren Zeile, bevor Sie die Aktivität aufrufen. Wenn Sie dann zurückkommen, wählen Sie diese bestimmte Reihe erneut aus.

Verwandte Themen