我在Fragment中创建了一个RecyclerView,但在重新加载数据时,RecyclerView不保持状态



//我在Fragment中创建了RecycleView,如下所示:

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

//在validateToken方法中,数据取自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方法,并重新加载RecyclerView适配器。现在,我想要的是保持RecyclerView的状态,这样当我从活动返回时,RecyclerView将保持在调用活动时的滚动位置。但对我来说,问题是它总是从一开始就存在。我也看到一些Stack Overflow的帖子,他们建议我使用Parceable,但我没有得到任何好处。Is什么都不做。

可以试试这个。您需要为每一行维护一个标识符。然后在转到活动之前保存第一个可见行的标识符。然后,当您返回时,再次选择该特定行。

最新更新