前言
相信大家都知道AndroID滚动控件的实现方式有很多,使用RecyclerVIEw也比较简单. 做了一个简单的年龄滚动控件,让我们来看看RecyclerVIEw的使用方式,主要有以下几点:
(1) 对齐控件中心位置.
(2) 计算滚动距离.
(3) 高亮中心视图.
(4) 实时显示中心数据.
(5) 停止时自动对齐.
(6) 滚动时,设置按钮状态开关.
效果
1. 框架
主要关注RecyclerVIEw部分逻辑.
/** * 初始化年龄滑动条 */ private voID initAgeList() { linearlayoutmanager mLayoutManager = new linearlayoutmanager(getActivity(),linearlayoutmanager.HORIZONTAL,false); mRvAgeList.setLayoutManager(mLayoutManager); mAgeAdapter = new PersonAgeAdapter(START_NUM,END_NUM); mRvAgeList.setAdapter(mAgeAdapter); mRvAgeList.addOnScrollListener(new RecyclerVIEw.OnScrollListener() { @OverrIDe public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,int newState) { super.onScrollStateChanged(recyclerVIEw,newState); mBDownStep.setEnabled(false); // 效果在暂停时显示,否则会导致重绘异常 if (newState == RecyclerVIEw.SCRolL_STATE_IDLE) { mAgeAdapter.highlightItem(getMIDdleposition()); mRvAgeList.scrollToposition(getScrollposition()); mLastValue = getMIDdleposition(); UserInfoManager.setAge(getMIDdleposition() + START_NUM); mBDownStep.setEnabled(true); // 滑动时不可用,停止时才可以 } } @OverrIDe public voID onScrolled(RecyclerVIEw recyclerVIEw,int dx,int dy) { // 值是实时增加 mTvAgeValue.setText(String.valueOf(getMIDdleposition() + START_NUM)); } }); mAgeAdapter.highlightItem(getMIDdleposition()); }
设置一个水平布局
linearlayoutmanager mLayoutManager = new linearlayoutmanager(getActivity(),false); mRvAgeList.setLayoutManager(mLayoutManager);
添加Adapter,设置起始和结束位置.
mAgeAdapter = new PersonAgeAdapter(START_NUM,END_NUM); mRvAgeList.setAdapter(mAgeAdapter);
2. Adapter
Adapter定制一些功能,如标示指向中心位置,数据联动显示,高亮Item
等.
/** * 年龄的适配器 * <p> * Created by wangchenlong on 15/11/12. */public class PersonAgeAdapter extends RecyclerVIEw.Adapter<PersonAgeAdapter.AgeItemVIEwHolder> { public static final int ITEM_NUM = 7; // 每行拥有的Item数,必须是奇数 private int mFrom; // 起始 private int mTo; // 终止 private int mHighlight = -1; // 高亮 public PersonAgeAdapter(int from,int to) { mFrom = from; mTo = to; } @OverrIDe public AgeItemVIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) { VIEw item = LayoutInflater.from(parent.getContext()). inflate(R.layout.vIEw_age_item,parent,false); // 设置Item的宽度 VIEwGroup.LayoutParams lp = item.getLayoutParams(); lp.wIDth = getItemStDWIDth(); return new AgeItemVIEwHolder(item); } @OverrIDe public voID onBindVIEwHolder(AgeItemVIEwHolder holder,int position) { holder.getTextVIEw().setText(String.valueOf(mFrom + position)); // 高亮显示 if (isSelected(position)) { holder.getTextVIEw().setTextSize(30); holder.getTextVIEw().setTextcolor(ChunyuApp.getAppContext().getResources().getcolor(R.color.black)); } else { holder.getTextVIEw().setTextSize(20); holder.getTextVIEw().setTextcolor(ChunyuApp.getAppContext().getResources().getcolor(R.color.gray_line)); } } // 高亮中心,更新前后位置 public voID highlightItem(int position) { mHighlight = position; int offset = ITEM_NUM / 2; for (int i = position - offset; i <= position + offset; ++i) notifyItemChanged(i); } // 判断是否是高亮 public boolean isSelected(int position) { return mHighlight == position; } @OverrIDe public int getItemCount() { return mTo - mFrom + 1; } // 获取标准宽度 public static int getItemStDWIDth() { displayMetrics displayMetrics = ChunyuApp.getAppContext().getResources().getdisplayMetrics(); return displayMetrics.wIDthPixels / ITEM_NUM; } // VIEwHolder public class AgeItemVIEwHolder extends RecyclerVIEw.VIEwHolder { private TextVIEw mTextVIEw; public AgeItemVIEwHolder(VIEw itemVIEw) { super(itemVIEw); mTextVIEw = (TextVIEw) itemVIEw.findVIEwByID(R.ID.item_age_value); mTextVIEw.setTag(this); } public TextVIEw getTextVIEw() { return mTextVIEw; } }}
每个单元格宽度是屏幕宽度的奇数分之一,填充屏幕,则起始指向中心.
@OverrIDe public AgeItemVIEwHolder onCreateVIEwHolder(VIEwGroup parent,false); // 设置Item的宽度 VIEwGroup.LayoutParams lp = item.getLayoutParams(); lp.wIDth = getItemStDWIDth(); return new AgeItemVIEwHolder(item); }
单数Item
数量,则中心的指示器必指向中心Item
的中心.
根据选中状态,更新Item
样式.
@OverrIDe public voID onBindVIEwHolder(AgeItemVIEwHolder holder,int position) { holder.getTextVIEw().setText(String.valueOf(mFrom + position)); // 高亮显示 if (isSelected(position)) { holder.getTextVIEw().setTextSize(30); holder.getTextVIEw().setTextcolor(ChunyuApp.getAppContext().getResources().getcolor(R.color.black)); } else { holder.getTextVIEw().setTextSize(20); holder.getTextVIEw().setTextcolor(ChunyuApp.getAppContext().getResources().getcolor(R.color.gray_line)); } }
设置高亮,把中心位置高亮,两边恢复,通知Adapter重绘VIEwHolder.
// 高亮中心,更新前后位置 public voID highlightItem(int position) { mHighlight = position; int offset = ITEM_NUM / 2; for (int i = position - offset; i <= position + offset; ++i) notifyItemChanged(i); } // 判断是否是高亮 public boolean isSelected(int position) { return mHighlight == position; }notifyItemChanged()会重绘所选择的页面.
获取宽度,把一行显示Item
数量设置为单数,则中心指向一个Item
.
// 获取标准宽度 public static int getItemStDWIDth() { displayMetrics displayMetrics = ChunyuApp.getAppContext().getResources().getdisplayMetrics(); return displayMetrics.wIDthPixels / ITEM_NUM; }
注意RecyclerVIEw不能移动半个单元,每行数量是单数时,则必会指向中心.
3. 滚动逻辑
在滚动时,实时更新页面显示; 在停止时,更新高亮和存储数据; 滚动结束时,激活按钮.
mRvAgeList.addOnScrollListener(new RecyclerVIEw.OnScrollListener() { @OverrIDe public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,newState); mBDownStep.setEnabled(false); // 效果在暂停时显示,int dy) { // 值是实时增加 mTvAgeValue.setText(String.valueOf(getMIDdleposition() + START_NUM)); } }); mAgeAdapter.highlightItem(getMIDdleposition()); } /** * 获取中间位置 * * @return 当前值 */ private int getMIDdleposition() { return getScrollposition() + (PersonAgeAdapter.ITEM_NUM / 2); } /** * 获取滑动值,滑动偏移 / 每个格子宽度 * * @return 当前值 */ private int getScrollposition() { return (int) ((double) mRvAgeList.computeHorizontalScrollOffset() / (double) PersonAgeAdapter.getItemStDWIDth()); }
判断滚动的距离单位,偏移总距离/单个Item
宽度.
private int getScrollposition() { return (int) ((double) mRvAgeList.computeHorizontalScrollOffset() / (double) PersonAgeAdapter.getItemStDWIDth()); }
computeHorizontalScrollOffset()
获取RecyclerVIEw的偏移总位移.
中间位置,还要加上半行Item
数量
private int getMIDdleposition() { return getScrollposition() + (PersonAgeAdapter.ITEM_NUM / 2); }
判断滚动是否停止.
if (newState == RecyclerVIEw.SCRolL_STATE_IDLE)
在滚动停止时,自动对齐.
mRvAgeList.scrollToposition(getScrollposition());
调用需要高亮显示的Item
.
mAgeAdapter.highlightItem(getMIDdleposition());
注意在滚动停止时,更新高亮比较好,否则重绘速度较慢,会影响滚动效果.
滑动效果
总结
好了,以上就是这篇文章的全部内容了,我们可以根据这些定制各式各样的滚动条了!希望这篇文章对大家能有所帮助。
总结以上是内存溢出为你收集整理的Android使用RecyclerView实现水平滚动控件全部内容,希望文章能够帮你解决Android使用RecyclerView实现水平滚动控件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)