介紹
github:github.com/apinIron/Li…
由於UI設計需要,模仿了淘寶的收貨地址選擇對話方塊,就簡單的封裝了一個對話方塊。
使用了TabLayout + ViewPager來進行實現,ViewPager中每個頁面都是一個RecyclerView。
效果如下:
使用
在程式碼中使用:
LinkageDialog dialog = new LinkageDialog.Builder(MainActivity.this, 3).setLinkageData(getCityList())
.setTitle("配送至")
.setTabIndicatorColor(Color.parseColor("#EA6F5A"))
.setTabTitleColor(Color.BLACK, Color.parseColor("#EA6F5A"))
.setTabIndicatorHeight((int) getResources().getDimension(R.dimen.indicator_height))
.setContentHeight((int) (getResources().getDimension(R.dimen.item_city_height) * 4))
.setOnLinkageAdapterListener(new LinkageDialog.IOnLinkageAdapterListener() {
@Override
public BaseLinkageItemAdapter getAdapter() {
return new MyLinkageItemAdapter(MainActivity.this);
}
})
.setOnLinkageSelectListener(new LinkageDialog.IOnLinkageSelectListener() {
@Override
public void onLinkageSelect(LinkageItem... items) {
toastLinkageItem(items);
}
}).build();
複製程式碼
方法描述
//設定對話方塊的標題
setTitle(String title)
//設定資料來源(資料需實現LinkageItem介面)
setLinkageData(List data)
//設定內容高度(RecyclerView)
setContentHeight(int contentHeight)
//設定tabLayout指示器顏色
setTabIndicatorColor(int colorTabIndicator)
//設定tabLayout指示器高度
setTabIndicatorHeight(int tabIndicatorHeight)
//設定tabLayout標題選中和未選中的字型顏色
setTabTitleColor(int colorTabSelectTitleColor,int colorTabWaitSelectTitleColor)
//監聽選擇事件
setOnLinkageSelectListener(IOnLinkageSelectListener listener)
//如需要自定義RecyclerView的item佈局,需設定這個方法
setOnLinkageAdapterListener(IOnLinkageAdapterListener listener)
複製程式碼
如果想要自定義選擇列表的item效果,只需要自定義自己的Adapter實現BaseLinkageItemAdapter即可,如下:
public class MyLinkageItemAdapter extends BaseLinkageItemAdapter<MyLinkageItemAdapter.ViewHolder> {
public MyLinkageItemAdapter(Context context) {
super(context);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_linkage_my, parent,false));
}
@Override
protected void bindView(ViewHolder holder, LinkageItem item, boolean isSelect) {
holder.textView.setText(item.getLinkageName());
holder.textView.setTextColor(isSelect ? Color.BLACK : Color.GRAY);
holder.imageView.setVisibility(isSelect ? View.VISIBLE : View.INVISIBLE);
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView;
public ViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_linkage_title);
imageView = itemView.findViewById(R.id.iv_select);
}
}
}
複製程式碼
實現
在建立對話方塊的時候需要設定最多聯動級數。
//新增tab
for (int i = 0; i < mBuilder.linkageCount; i++) {
tlLinkageTab.addTab(tlLinkageTab.newTab());
}
複製程式碼
但是新增的tab都是可以點選的,可是需要的效果是已選擇過的tab和待選擇的tab才可以點選,然後就通過設定clickable來讓待選擇的tab後面的tab都無法點選。(每個tab並不是tabLayout的直接孩子,需要getChildAt(0),然後遍歷獲取每一個tab)
LinearLayout tabStrip = ((LinearLayout)tlLinkageTab.getChildAt(0));
for(int i = position; i < tabStrip.getChildCount(); i++) {
tabStrip.getChildAt(i).setClickable(false);
setLinkageTabText(i,"");
}
複製程式碼
到此tab還有一個問題,就是 tabLayout.setTabTextColorssetTabTextColors(int normalColor, int selectedColor)
無法直接使用,因為他是效果是選中和預設情況下tab的字型顏色,而需求是已選擇過的tab是一個字型顏色,等待選擇的tab字型是一個顏色而不是跟著選擇走。所以用了tab.setCustomView(tv)
方式自定義tab的View。
然後就是為ViewPager設定介面卡,每個頁面都建立一個RecyclerView。監聽每個recyclerView的item點選事件來處理點選事件。
已這篇文章記錄下當初實現的時候遇到的一些問題。