先说项目ui需求图:
- 滑动到第一项的时候,不可再向左滑动,并且左侧显示:“左侧没有内容”。
- 滑动到最后一项的时候,不可再向右滑动,并且右侧显示:“右侧没有内容”。
- 用户在开始滑动的时候,“左侧没有内容”或是“右侧没有内容”的view要立即消失。
- 当前item需要有放大效果,并且有边框。
- 不是当前的item需要有缩小效果,无边框。
如下图所展示:
需求实现:
难点如下:
1. 怎么用RecycelView实现这种画廊效果。
2. 选中item的边框怎么处理。
3. 最左侧和最右侧的无内容view怎么展示和隐藏的问题。
先说第一个难点怎么解决:
我曾经试图尝试过用viewpager做,但是效果不理想,然后在github上查找到了一款非常符合我们项目需求的控件:
DiscreteScrollView,这个控件基本上满足了我们的需求,只需要细节调整即可。文档中有描述怎么使用,参照导入就好。
第二个难点:选中item的边框处理:
在Activity中实现 DiscreteScrollView.OnItemChangedListener,在这个方法中,可以拿到当前、前一个、后一个RecyclerView.ViewHolder来做背景边框特殊处理。
当然,我这种方法可能不是最好的,因为activit中展示的时候,只能看到3个item,如果需求设计要看到5个item,处理起来就更麻烦一点了。
@Override
public void onCurrentItemChanged(@Nullable RecyclerView.ViewHolder viewHolder, int adapterPosition) {
Timber.d("onCurrentItemChanged %d", adapterPosition);
StepAdapter.ViewHolder holder = (StepAdapter.ViewHolder) viewHolder;//当前选中的
holder.rlLayout.setBackgroundResource(R.drawable.bg_step_shape);
if (adapterPosition == 0) {
StepAdapter.ViewHolder viewHolder0 = (StepAdapter.ViewHolder) mDsvStep.getViewHolder(adapterPosition + 1);
viewHolder0.rlLayout.setBackgroundResource(0);
} else if (adapterPosition > 0 && adapterPosition < mStepBeanList.size() - 1) {//还没有滑动到最后:
StepAdapter.ViewHolder viewHolder1 = (StepAdapter.ViewHolder) mDsvStep.getViewHolder(adapterPosition - 1);
viewHolder1.rlLayout.setBackgroundResource(0);
StepAdapter.ViewHolder viewHolder2 = (StepAdapter.ViewHolder) mDsvStep.getViewHolder(adapterPosition + 1);
viewHolder2.rlLayout.setBackgroundResource(0);
} else {
StepAdapter.ViewHolder viewHolder3 = (StepAdapter.ViewHolder) mDsvStep.getViewHolder(adapterPosition - 1);
viewHolder3