使用RecyclerView实现滚动控件

滚动控件的实现方式有很多, 使用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(), LinearLayoutManager.HORIZONTAL, 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;}// ViewHolderpublic 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;}}}于是渐渐开始有些伤怀。

使用RecyclerView实现滚动控件

相关文章:

你感兴趣的文章:

标签云: