該庫是基於RecyclerView的可滾動列表的實現,其中選中項居中,並且可以使用滑動來更改。
介紹
1. 可設置橫向滑動,縱向滑動。
2. 選中項居中。
3. 可設置無限滑動。
4. 滑動到指定item。
5. 內有滑動動畫,可設置滑動動畫時長。
先上代碼:
示例
使用說明
添加jitpack庫
// build.gradle(Project:)
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
添加依賴
dependencies {
implementation 'com.github.ZLYang110:HorizontalView:1.0'
}
使用
1. 使用xml或代碼將DiscreteScrollView添加到佈局中:
2. 創建您的RecyclerView.Adapter實現。如果您不知道如何做,請參考該示例。
3. 設置適配器。
4. 大功告成!
<com.zlylib.horizontalviewlib.HorizontalView
android:id="@+id/item_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
private InfiniteScrollAdapter infiniteAdapter;
itemPicker.setOrientation(DSVOrientation.HORIZONTAL);
infiniteAdapter = InfiniteScrollAdapter.wrap(new CardAdapter(CardBean.getData()));
itemPicker.setAdapter(infiniteAdapter);
itemPicker.setItemTransitionTimeMillis(150);//設置滑動時長
itemPicker.setItemTransformer(new ScaleTransformer.Builder()
.setMinScale(0.8f)
.build());
itemPicker.addOnItemChangedListener(new HorizontalView.OnItemChangedListener<RecyclerView.ViewHolder>() {
@Override
public void onCurrentItemChanged(@Nullable RecyclerView.ViewHolder viewHolder, int position) {
int positionInDataSet = infiniteAdapter.getRealPosition(position);
onItemChanged(CardBean.getData().get(positionInDataSet));
}
});
API
General
scrollView.setOrientation(DSVOrientation o); //設置視圖
scrollView.setOffscreenItems(count); //Reserve extra space equal to (childSize * count) on each side of the view
scrollView.setOverScrollEnabled(enabled); //Can also be set using android:overScrollMode xml attribute
scrollView.getCurrentItem(); //返回當前所選項目的適配器位置;如果適配器爲空,則返回-1。
scrollView.scrollToPosition(int position); //初始位置
scrollView.smoothScrollToPosition(int position); //通過動畫滾動到指定位置
scrollView.setItemTransitionTimeMillis(int millis); //同股票滾動所需時間
scrollView.setItemTransformer(new ScaleTransformer.Builder()
.setMaxScale(1.05f)
.setMinScale(0.8f)
.setPivotX(Pivot.X.CENTER) // CENTER is a default one
.setPivotY(Pivot.Y.BOTTOM) // CENTER is a default one
.build());
滑動多個項目
要允許瀏覽多個項目,請調用:
scrollView.setSlideOnFling(true);
默認閾值設置爲2100。閾值越低,動畫越流暢。您可以通過以下方式調整閾值:
scrollView.setSlideOnFlingThreshold(value);
無限滾動
無限滾動在適配器級別實現:
InfiniteScrollAdapter wrapper = InfiniteScrollAdapter.wrap(yourAdapter);
scrollView.setAdapter(wrapper);
實例InfiniteScrollAdapter具有以下有用的方法:
int getRealItemCount();
int getRealCurrentPosition();
int getRealPosition(int position);
/*
* 在以下用例中,您可能需要此方法:
* int targetAdapterPosition = wrapper.getClosestPosition(targetPosition);
* scrollView.smoothScrollTo(targetAdapterPosition);
* 滾動數據集以達到目標位置所需的最少數量
*/
int getClosestPosition(int position);
當前InfiniteScrollAdapter處理數據集 效率很低請放心使用.
回調狀態
滾動狀態回調
scrollView.addScrollStateChangeListener(listener);
scrollView.removeScrollStateChangeListener(listener);
public interface ScrollStateChangeListener<T extends ViewHolder> {
void onScrollStart(T currentItemHolder, int adapterPosition); //滾動時調用
void onScrollEnd(T currentItemHolder, int adapterPosition); //滾動結束時調用
/**
* 滾動進行時調用
* @param scrollPosition是間隔[-1f..1f]內的一個值,它對應於currentSelectedView的位置。
* In idle state:
* |view1| |currentlySelectedView| |view2|
* -view1 is on position -1;
* -currentlySelectedView is on position 0;
* -view2 is on position 1.
* @param currentIndex-當前視圖的索引
* @param newIndex-成爲新的當前視圖的視圖的索引
* @param currentHolder-當前視圖的ViewHolder
* @paramnewCurrent-成爲新當前視圖的視圖的ViewHolder
*/
void onScroll(float scrollPosition, int currentIndex, int newIndex, @Nullable T currentHolder, @Nullable T newCurrentHolder);
}
滾動回調:
scrollView.addScrollListener(listener);
scrollView.removeScrollListener(listener);
public interface ScrollListener<T extends ViewHolder> {
//The same as ScrollStateChangeListener, but for the cases when you are interested only in onScroll()
void onScroll(float scrollPosition, int currentIndex, int newIndex, @Nullable T currentHolder, @Nullable T newCurrentHolder);
}
當前選中回調:
scrollView.addOnItemChangedListener(listener);
scrollView.removeOnItemChangedListener(listener);
public interface OnItemChangedListener<T extends ViewHolder> {
/**
*如果數據集爲空,viewHolder將爲null
*/
void onCurrentItemChanged(@Nullable T viewHolder, int adapterPosition);
}
聯繫方式
QQ: 1833309873
E-mail: [email protected]
最後:
給個star吧!!!!!