1. 程式人生 > >RecyclerView+SnapHelper實現無限迴圈篩選控制元件

RecyclerView+SnapHelper實現無限迴圈篩選控制元件

專案用到橫向滑動的單項選擇控制元件。需求如下:
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; } } } }