RecyclerView+SnapHelper實現無限迴圈篩選控制元件
阿新 • • 發佈:2019-01-24
專案用到橫向滑動的單項選擇控制元件。需求如下:
1.選項由後臺配置,也就是控制元件要動態設定寬度;2.每次滑動都要左對齊,並預設選中最左邊選項;3.控制元件可以無限迴圈。
動態設定控制元件寬度:獲取adapter的item寬度;獲取adapter裡裝載的itemCount。
每次滑動都要左對齊:利用LinearSnapHelper中calculateDistanceToFinalSnap的方法實現;
預設選中最左item:利用RecycleView的LayoutManager中查詢顯示第一項的方法linearManager.findFirstVisibleItemPosition()來實現。
控制元件無限迴圈:將父類adapter的itemCount設定為Integer.MAX_VALUE。
效果圖:
核心程式碼:
FilterWheelView.java
private void initData(){
if (filterItemEntity != null) {
if (!TextUtils.isEmpty(filterItemEntity.getTitle())) {
filtrationType.setText(filterItemEntity.getTitle());
}
if (filterItemEntity.getOptions() != null ) {
mAdapter = new ADA_FilterWheel(mContext, filterItemEntity.getOptions());
}
mLoopRecyclerView.setAdapter(mAdapter);
if (adaItemCallback!=null){
adaItemCallback.sendItems(mAdapter.getItemRawCount());
}
//設定滾動監聽
mLoopRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//滾動停止時,獲取recycler顯示的第一項的position
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int items = mAdapter.getItemRawCount();
int firstItemPosition =linearManager.findFirstVisibleItemPosition();
//高亮顯示最左邊的item
mAdapter.highlightItem(firstItemPosition % items);
}
//滾動過程中,釋放選中狀態
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
mAdapter.reset();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
//找到當前選中的實體
for (int i = 0; i < filterItemEntity.getOptions().size(); i++) {
FilterOptionsEntity bean = filterItemEntity.getOptions().get(i);
if (bean.isCheck()) {
// 當前選中實體類
currentBean = bean;
break;
}
}
}
}