@Override public boolean isInAbsoluteStart() { return !mIsItemTouchInEffect && mImpl.isInAbsoluteStart(); }
@Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { mIsItemTouchInEffect = actionState != 0; super.onSelectedChanged(viewHolder, actionState); } }).attachToRecyclerView(mRecyclerView);
public RecyclerViewOverScrollDecorAdapter(RecyclerView recyclerView, Impl impl, ItemTouchHelper.Callback itemTouchHelperCallback) { this(recyclerView, impl); setUpTouchHelperCallback(itemTouchHelperCallback); }
@Test public void detach_overScrollInEffect_detachFromView() throws Exception { when(mViewAdapter.isInAbsoluteStart()).thenReturn(true); when(mViewAdapter.isInAbsoluteEnd()).thenReturn(false); HorizontalOverScrollBounceEffectDecorator uut = getUUT(); uut.onTouch(mView, createShortRightMoveEvent()); // Act uut.detach(); // Assert verify(mView).setOnTouchListener(eq((View.OnTouchListener) null)); verify(mView).setOverScrollMode(View.OVER_SCROLL_ALWAYS); }
@Override public View getView() { return mViewAdapter.getView(); }
/** * Set up the over-scroll effect over a specified {@link RecyclerView} view. * <br/>Only recycler-views using <b>native</b> Android layout managers (i.e. {@link LinearLayoutManager}, * {@link GridLayoutManager} and {@link StaggeredGridLayoutManager}) are currently supported * by this convenience method. * * @param recyclerView The view. * @param orientation Either {@link #ORIENTATION_HORIZONTAL} or {@link #ORIENTATION_VERTICAL}. * * @return The over-scroll effect 'decorator', enabling further effect configuration. */ public static IOverScrollDecor setUpOverScroll(RecyclerView recyclerView, int orientation) { switch (orientation) { case ORIENTATION_HORIZONTAL: return new HorizontalOverScrollBounceEffectDecorator(new RecyclerViewOverScrollDecorAdapter(recyclerView)); case ORIENTATION_VERTICAL: return new VerticalOverScrollBounceEffectDecorator(new RecyclerViewOverScrollDecorAdapter(recyclerView)); default: throw new IllegalArgumentException("orientation"); } }
public RecyclerViewOverScrollDecorAdapter(RecyclerView recyclerView) { mRecyclerView = recyclerView; final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) { final int orientation = (layoutManager instanceof LinearLayoutManager ? ((LinearLayoutManager) layoutManager).getOrientation() : ((StaggeredGridLayoutManager) layoutManager).getOrientation()); if (orientation == LinearLayoutManager.HORIZONTAL) { mImpl = new ImplHorizLayout(); } else { mImpl = new ImplVerticalLayout(); } } else { throw new IllegalArgumentException("Recycler views with custom layout managers are not supported by this adapter out of the box." + "Try implementing and providing an explicit 'impl' parameter to the other c'tors, or otherwise create a custom adapter subclass of your own."); } }
public static IOverScrollDecor setUpOverScroll(ListView listView) { return new VerticalOverScrollBounceEffectDecorator(new AbsListViewOverScrollDecorAdapter(listView)); }
@Override public boolean isInAbsoluteEnd() { return !mIsItemTouchInEffect && mImpl.isInAbsoluteEnd(); }
public static IOverScrollDecor setUpOverScroll(HorizontalScrollView scrollView) { return new HorizontalOverScrollBounceEffectDecorator(new HorizontalScrollViewOverScrollDecorAdapter(scrollView)); }
public static IOverScrollDecor setUpOverScroll(ScrollView scrollView) { return new VerticalOverScrollBounceEffectDecorator(new ScrollViewOverScrollDecorAdapter(scrollView)); }
public static IOverScrollDecor setUpOverScroll(ViewPager viewPager) { return new HorizontalOverScrollBounceEffectDecorator(new ViewPagerOverScrollDecorAdapter(viewPager)); }
@Override public boolean isInAbsoluteStart() { return mView.getChildCount() > 0 && !canScrollListUp(); }
@Override public boolean isInAbsoluteEnd() { return mView.getChildCount() > 0 && !canScrollListDown(); }
/** * Set up the over-scroll over a generic view, assumed to always be over-scroll ready (e.g. * a plain text field, image view). * * @param view The view. * @param orientation One of {@link #ORIENTATION_HORIZONTAL} or {@link #ORIENTATION_VERTICAL}. * * @return The over-scroll effect 'decorator', enabling further effect configuration. */ public static IOverScrollDecor setUpStaticOverScroll(View view, int orientation) { switch (orientation) { case ORIENTATION_HORIZONTAL: return new HorizontalOverScrollBounceEffectDecorator(new StaticOverScrollDecorAdapter(view)); case ORIENTATION_VERTICAL: return new VerticalOverScrollBounceEffectDecorator(new StaticOverScrollDecorAdapter(view)); default: throw new IllegalArgumentException("orientation"); } }
protected ObjectAnimator createBounceBackAnimator(float startOffset) { final View view = mViewAdapter.getView(); // Duration is proportional to the view's size. float bounceBackDuration = (Math.abs(startOffset) / mAnimAttributes.mMaxOffset) * MAX_BOUNCE_BACK_DURATION_MS; ObjectAnimator bounceBackAnim = ObjectAnimator.ofFloat(view, mAnimAttributes.mProperty, mStartAttr.mAbsOffset); bounceBackAnim.setDuration(Math.max((int) bounceBackDuration, MIN_BOUNCE_BACK_DURATION_MS)); bounceBackAnim.setInterpolator(mBounceBackInterpolator); bounceBackAnim.addUpdateListener(this); return bounceBackAnim; } }
public RecyclerViewOverScrollDecorAdapter(RecyclerView recyclerView, ItemTouchHelper.Callback itemTouchHelperCallback) { this(recyclerView); setUpTouchHelperCallback(itemTouchHelperCallback); }
public static IOverScrollDecor setUpOverScroll(GridView gridView) { return new VerticalOverScrollBounceEffectDecorator(new AbsListViewOverScrollDecorAdapter(gridView)); }
@Before public void setUp() throws Exception { mView = mock(View.class); mViewAdapter = mock(IOverScrollDecoratorAdapter.class); when(mViewAdapter.getView()).thenReturn(mView); mStateListener = mock(IOverScrollStateListener.class); mUpdateListener = mock(IOverScrollUpdateListener.class); }
@Before public void setUp() throws Exception { mView = mock(View.class); mViewAdapter = mock(IOverScrollDecoratorAdapter.class); when(mViewAdapter.getView()).thenReturn(mView); mStateListener = mock(IOverScrollStateListener.class); mUpdateListener = mock(IOverScrollUpdateListener.class); }