Java tutorial
/* * Copyright (C) 2015 Haruki Hasegawa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ru.androidtest.ui.fragments; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graphics.drawable.NinePatchDrawable; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.decoration.ItemShadowDecorator; import com.h6ah4i.android.widget.advrecyclerview.decoration.SimpleListDividerDecorator; import com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; import ru.androidtest.R; import ru.androidtest.adapters.CustomExpandableItemAdapter; import ru.androidtest.interactionIterface.OnInteractionListener; public class ExpandableRecyclerListViewFragment extends Fragment implements RecyclerViewExpandableItemManager.OnGroupCollapseListener, RecyclerViewExpandableItemManager.OnGroupExpandListener { private static final String SAVED_STATE_EXPANDABLE_ITEM_MANAGER = "RecyclerViewExpandableItemManager"; private OnInteractionListener mListener; private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private RecyclerView.Adapter mWrappedAdapter; private RecyclerViewExpandableItemManager mRecyclerViewExpandableItemManager; public ExpandableRecyclerListViewFragment() { super(); } public static ExpandableRecyclerListViewFragment newInstance() { return new ExpandableRecyclerListViewFragment(); } @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnInteractionListener"); } } @TargetApi(23) @Override public void onAttach(Context context) { super.onAttach(context); try { mListener = (OnInteractionListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement OnInteractionListener"); } } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recycler_list_view, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //noinspection ConstantConditions mRecyclerView = (RecyclerView) getView().findViewById(R.id.recycler_view); mLayoutManager = new LinearLayoutManager(getContext()); final Parcelable eimSavedState = (savedInstanceState != null) ? savedInstanceState.getParcelable(SAVED_STATE_EXPANDABLE_ITEM_MANAGER) : null; mRecyclerViewExpandableItemManager = new RecyclerViewExpandableItemManager(eimSavedState); mRecyclerViewExpandableItemManager.setOnGroupExpandListener(this); mRecyclerViewExpandableItemManager.setOnGroupCollapseListener(this); //adapter final CustomExpandableItemAdapter myItemAdapter = new CustomExpandableItemAdapter( mListener.getExpandableDataProvider()); mWrappedAdapter = mRecyclerViewExpandableItemManager.createWrappedAdapter(myItemAdapter); // wrap for expanding final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator(); // Change animations are enabled by default since support-v7-recyclerview v22. // Need to disable them when using animation indicator. animator.setSupportsChangeAnimations(false); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter(mWrappedAdapter); // requires *wrapped* adapter mRecyclerView.setItemAnimator(animator); mRecyclerView.setHasFixedSize(false); // additional decorations //noinspection StatementWithEmptyBody if (supportsViewElevation()) { // Lollipop or later has native drop shadow feature. ItemShadowDecorator is not required. } else { mRecyclerView.addItemDecoration(new ItemShadowDecorator( (NinePatchDrawable) ContextCompat.getDrawable(getContext(), R.drawable.material_shadow_z1))); } mRecyclerView.addItemDecoration(new SimpleListDividerDecorator( ContextCompat.getDrawable(getContext(), R.drawable.list_divider_h), true)); mRecyclerViewExpandableItemManager.attachRecyclerView(mRecyclerView); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // save current state to support screen rotation, etc... if (mRecyclerViewExpandableItemManager != null) { outState.putParcelable(SAVED_STATE_EXPANDABLE_ITEM_MANAGER, mRecyclerViewExpandableItemManager.getSavedState()); } } @Override public void onDestroyView() { if (mRecyclerViewExpandableItemManager != null) { mRecyclerViewExpandableItemManager.release(); mRecyclerViewExpandableItemManager = null; } if (mRecyclerView != null) { mRecyclerView.setItemAnimator(null); mRecyclerView.setAdapter(null); mRecyclerView = null; } if (mWrappedAdapter != null) { WrapperAdapterUtils.releaseAll(mWrappedAdapter); mWrappedAdapter = null; } mLayoutManager = null; super.onDestroyView(); } @Override public void onGroupCollapse(int groupPosition, boolean fromUser) { } @Override public void onGroupExpand(int groupPosition, boolean fromUser) { if (fromUser) { adjustScrollPositionOnGroupExpanded(groupPosition); } } private void adjustScrollPositionOnGroupExpanded(int groupPosition) { int childItemHeight = getActivity().getResources().getDimensionPixelSize(R.dimen.list_item_height); int topMargin = (int) (getActivity().getResources().getDisplayMetrics().density * 16); // top-spacing: 16dp int bottomMargin = topMargin; // bottom-spacing: 16dp mRecyclerViewExpandableItemManager.scrollToGroup(groupPosition, childItemHeight, topMargin, bottomMargin); } private boolean supportsViewElevation() { return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); } // public AbstractExpandableDataProvider getDataProvider() { // return ((ExpandableActivity) getActivity()).getExpandableDataProvider(); // } }