2023年7月15日发(作者:)
实现快速选择的城市列表组件-字母索引1.背景项⽬有时候需要选择城市,来跳转到不同的业务逻辑中。所以有必要对各个业务线提供⼀个公共的组件。2.思路很多时候,城市列表有⼏块逻辑,城市列表,热门城市,当前城市,甚⾄历史记录。但是具体什么模块,⼜不清楚业务需要。所以需要抽取。1.整个列表多为多布局存在,但是这⾥不是普通的多布局,是经过包装适配器的形式来做的。2.内容的处理,如当前位置是⼀个特别的布局结构,所以作为⼀个单独的布局,剩下的就和列表类似,所以可以作为普通的布局结构,只是需要区分数据的类别⽽已。3.忽略每个条⽬内部城市的排列形式,⼤家基于业务不同,item的形式不同。4.注意每个分类的组标签,如 A B,这⾥使⽤itemDecroation来做的,需要了解相关间隔线的逻辑。5.字母的快速索引使⽤⾃定义view,来绘制每个字母出来,同时处理点击和滑动的事件逻辑。且和列表进⾏交互。3.1 城市列表 mCitylistlayout = findViewById(stLayout);//添加当前位置数据和热门、普通数据列表 rLocation(cityBean, _city); ySpecialData("热门", hotlist); yList(allList); mClickListener(new ickListener() { @Override public void headerViewClick(CityBean cityBean) { xt(, "" + ng(), _SHORT).show(); } @Override public void flowItemClick(CityBean cityBean) { xt(, "" + ng(), _SHORT).show(); } });适配器相关逻辑 if (mAdapter == null) { //处理普通数据的适配器 mAdapter = new BaseCityAdapter(getContext()); } //处理头部数据的适配器,eg:
当前位置 mHeaderAdapter = new Header_FooterWrapperAdapter(mAdapter) { @Override protected void onBindHeaderHolder(ViewHolder holder, int headerPos, int layoutId, CityBean cityBean) { t(on, me()); w(on).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (itemClickListener!=null){ ViewClick(cityBean); } } }); } }; derView(layoutid, currCityBean); //添加普通数据列表 aMap(hashMap); //添加⾃定义间隔线,在此处是字母组名 addItemDecoration(); //如果没有头部适配器,说明没有添加头部类型 if (mHeaderAdapter == null) { pter(mAdapter); } else { pter(mHeaderAdapter); }3.2 字母组名 private void addItemDecoration() { //添加⾃定义分割线----此处是字母组名 mDecoration = new SuspensionDecoration(getContext(), hashMap); if (mHeaderAdapter != null) { derViewCount(derViewCount()); } mDecoration(mDecoration); //如果add两个,那么按照先后顺序,依次渲染。 mDecoration(new DividerItemDecoration(getContext(), AL)); } public SuspensionDecoration(Context context, HashMap
绘制在最上层 int pos = ((LinearLayoutManager) (outManager())).findFirstVisibleItemPosition(); pos -= getHeaderViewCount(); if (hashMap == null || y() || pos > () - 1 || pos < 0) { return;//越界 } String tag = getSuspensionFirstWord(pos); View child = ewHolderForLayoutPosition(pos + getHeaderViewCount()).itemView; boolean flag = false;//定义⼀个flag,Canvas是否位移过的标志 if (null != tag && !(getSuspensionFirstWord(pos + 1))) {//当前第⼀个可见的Item的tag,不等于其后⼀个item的tag,说明悬浮的View要切换了 if (ght() + () < mTitleHeight) { (); flag = true; ate(0, ght() + () - mTitleHeight); } } or(COLOR_TITLE_BG); ct(dingLeft(), dingTop(), ht() - dingRight(), dingTop() + mTitleHeight,
mPaint); or(COLOR_TITLE_FONT); tBounds(tag, 0, (), mBounds); xt(tag, dingLeft() + defaultPaddingLeft, dingTop() + mTitleHeight - (mTitleHeight / 2 - () / 2), mPaint); if (flag) e(); }
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689429804a246871.html
评论列表(0条)