RecyclerView+SnapHelper實(shí)現(xiàn)無限循環(huán)篩選控件
項(xiàng)目用到橫向滑動的單項(xiàng)選擇控件。需求如下:
1.選項(xiàng)由后臺配置,也就是控件要動態(tài)設(shè)置寬度;2.每次滑動都要左對齊,并默認(rèn)選中最左邊選項(xiàng);3.控件可以無限循環(huán)。
動態(tài)設(shè)置控件寬度:獲取adapter的item寬度;獲取adapter里裝載的itemCount。
每次滑動都要左對齊:利用LinearSnapHelper中calculateDistanceToFinalSnap的方法實(shí)現(xiàn);
默認(rèn)選中最左item:利用RecycleView的LayoutManager中查找顯示第一項(xiàng)的方法linearManager.findFirstVisibleItemPosition()來實(shí)現(xiàn)。
控件無限循環(huán):將父類adapter的itemCount設(shè)置為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());
}
//設(shè)置滾動監(jiān)聽
mLoopRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//滾動停止時,獲取recycler顯示的第一項(xiàng)的position
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int items = mAdapter.getItemRawCount();
int firstItemPosition =linearManager.findFirstVisibleItemPosition();
//高亮顯示最左邊的item
mAdapter.highlightItem(firstItemPosition % items);
}
//滾動過程中,釋放選中狀態(tài)
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
mAdapter.reset();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
//找到當(dāng)前選中的實(shí)體
for (int i = 0; i < filterItemEntity.getOptions().size(); i++) {
FilterOptionsEntity bean = filterItemEntity.getOptions().get(i);
if (bean.isCheck()) {
// 當(dāng)前選中實(shí)體類
currentBean = bean;
break;
}
}
}
}
demo:下載地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
RecyclerView通過GridLayoutManager實(shí)現(xiàn)多樣式布局的示例
本篇文章主要介紹了RecyclerView通過GridLayoutManager實(shí)現(xiàn)多樣式布局的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
Android實(shí)現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法,通過ListView控件綁定setOnScrollListener方法簡單實(shí)現(xiàn)動態(tài)加載數(shù)據(jù)的功能,需要的朋友可以參考下2016-01-01
Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解
這篇文章主要介紹了Android Activity 與Service進(jìn)行數(shù)據(jù)交互的相關(guān)資料,在開發(fā)Android App的時候經(jīng)常會使用這樣的功能,需要的朋友可以參考下2016-10-10
Android Zygote啟動構(gòu)造流程及進(jìn)程創(chuàng)建詳解
這篇文章主要為大家介紹了Android Zygote啟動構(gòu)造流程及進(jìn)程創(chuàng)建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
android導(dǎo)入第三方j(luò)ar包報(bào)錯 如何正確導(dǎo)入jar包
怎樣在android平臺上使用第三方j(luò)ar包,為什么我在引入了,編譯時沒有錯誤,運(yùn)行時就有錯誤,報(bào)無法實(shí)例化錯誤,請問這是什么原因,本文給于解決方法,需要了解的朋友可以參考下2012-12-12
Android實(shí)現(xiàn)微信自動搶紅包的程序
簡單實(shí)現(xiàn)了微信自動搶紅包的服務(wù),原理就是根據(jù)關(guān)鍵字找到相應(yīng)的View, 然后自動點(diǎn)擊,接下來通過本文給大家介紹Android實(shí)現(xiàn)微信自動搶紅包的程序,對android微信自動搶紅包相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-02-02

