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 com.h6ah4i.android.example.advrecyclerview.demo_s_legacy; import android.graphics.drawable.NinePatchDrawable; import android.os.Build; import android.os.Bundle; 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.example.advrecyclerview.R; import com.h6ah4i.android.example.advrecyclerview.common.data.AbstractDataProvider; import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.decoration.ItemShadowDecorator; import com.h6ah4i.android.widget.advrecyclerview.decoration.SimpleListDividerDecorator; import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager; import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; public class RecyclerListViewFragment extends Fragment { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private RecyclerView.Adapter mAdapter; private RecyclerView.Adapter mWrappedAdapter; private RecyclerViewSwipeManager mRecyclerViewSwipeManager; private RecyclerViewTouchActionGuardManager mRecyclerViewTouchActionGuardManager; public RecyclerListViewFragment() { super(); } @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(), LinearLayoutManager.VERTICAL, false); // touch guard manager (this class is required to suppress scrolling while swipe-dismiss animation is running) mRecyclerViewTouchActionGuardManager = new RecyclerViewTouchActionGuardManager(); mRecyclerViewTouchActionGuardManager.setInterceptVerticalScrollingWhileAnimationRunning(true); mRecyclerViewTouchActionGuardManager.setEnabled(true); // swipe manager mRecyclerViewSwipeManager = new RecyclerViewSwipeManager(); //adapter final MyLegacySwipeableItemAdapter myItemAdapter = new MyLegacySwipeableItemAdapter(getDataProvider()); myItemAdapter.setEventListener(new MyLegacySwipeableItemAdapter.EventListener() { @Override public void onItemRemoved(int position) { ((LegacySwipeableExampleActivity) getActivity()).onItemRemoved(position); } @Override public void onItemPinned(int position) { ((LegacySwipeableExampleActivity) getActivity()).onItemPinned(position); } @Override public void onItemViewClicked(View v, boolean pinned) { onItemViewClick(v, pinned); } }); mAdapter = myItemAdapter; mWrappedAdapter = mRecyclerViewSwipeManager.createWrappedAdapter(myItemAdapter); // wrap for swiping final GeneralItemAnimator animator = new SwipeDismissItemAnimator(); // Change animations are enabled by default since support-v7-recyclerview v22. // Disable the change animation in order to make turning back animation of swiped item works properly. animator.setSupportsChangeAnimations(false); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter(mWrappedAdapter); // requires *wrapped* adapter mRecyclerView.setItemAnimator(animator); // 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)); // NOTE: // The initialization order is very important! This order determines the priority of touch event handling. // // priority: TouchActionGuard > Swipe > DragAndDrop mRecyclerViewTouchActionGuardManager.attachRecyclerView(mRecyclerView); mRecyclerViewSwipeManager.attachRecyclerView(mRecyclerView); // for debugging // animator.setDebug(true); // animator.setMoveDuration(2000); // animator.setRemoveDuration(2000); // mRecyclerViewSwipeManager.setMoveToOutsideWindowAnimationDuration(2000); // mRecyclerViewSwipeManager.setReturnToDefaultPositionAnimationDuration(2000); } @Override public void onDestroyView() { if (mRecyclerViewSwipeManager != null) { mRecyclerViewSwipeManager.release(); mRecyclerViewSwipeManager = null; } if (mRecyclerViewTouchActionGuardManager != null) { mRecyclerViewTouchActionGuardManager.release(); mRecyclerViewTouchActionGuardManager = null; } if (mRecyclerView != null) { mRecyclerView.setItemAnimator(null); mRecyclerView.setAdapter(null); mRecyclerView = null; } if (mWrappedAdapter != null) { WrapperAdapterUtils.releaseAll(mWrappedAdapter); mWrappedAdapter = null; } mAdapter = null; mLayoutManager = null; super.onDestroyView(); } private void onItemViewClick(View v, boolean pinned) { int position = mRecyclerView.getChildAdapterPosition(v); if (position != RecyclerView.NO_POSITION) { ((LegacySwipeableExampleActivity) getActivity()).onItemClicked(position); } } private boolean supportsViewElevation() { return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); } public AbstractDataProvider getDataProvider() { return ((LegacySwipeableExampleActivity) getActivity()).getDataProvider(); } public void notifyItemChanged(int position) { mAdapter.notifyItemChanged(position); } public void notifyItemInserted(int position) { mAdapter.notifyItemInserted(position); mRecyclerView.scrollToPosition(position); } }