android横向滚动控件,Android使用RecyclerView实现水平滚动控件

前言

相信大家都知道Android滚动控件的实现方式有很多, 使用RecyclerView也比较简单. 做了一个简单的年龄滚动控件, 让我们来看看RecyclerView的使用方式, 主要有以下几点:

(1) 对齐控件中心位置.

(2) 计算滚动距离.

(3) 高亮中心视图.

(4) 实时显示中心数据.

(5) 停止时自动对齐.

(6) 滚动时, 设置按钮状态开关.

效果

f0b871dfd93d52d0f5539ac5d2c9f82e.png

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等.

/**

* 年龄的适配器

*

* Created by wangchenlong on 15/11/12.

*/

public class PersonAgeAdapter extends RecyclerView.Adapter {

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;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值