水平方向的RecyclerView
最近做了一个项目需要实现一个卡片式的水平滑动,但是不能手势滑动,点击卡片上的按钮之后滑动到下一个卡片,所以想到用RecyclerView实现,去掉它的手势滑动,点击按钮之后再代码控制滑动到下一个卡片。
接下来就是一步一步的实现。
1.引入RecyclerView。
compile'com.android.support:recyclerview-v7:25.+'
2.在布局文件中使用RecyclerView。
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3.创建RecyclerView的item布局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"> <TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test"
android:textColor="@android:color/black"
android:textSize="36sp" /> <Button
android:id="@+id/item_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:text="下一页"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
4.实现RecyclerViewAdapter。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerHolder> {
private static final String TAG = RecyclerViewAdapter.class.getSimpleName();
private List<String> dataList;
private Context mContext;
private RecyclerView recyclerView;
public RecyclerViewAdapter(Context context, List<String> dataList) {
mContext = context;
this.dataList = dataList;
}
@Override
public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recycler_item_view, parent, false);
RecyclerHolder holder = new RecyclerHolder(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerHolder holder, final int position) {
holder.textView.setText(dataList.get(position));
if (position == dataList.size() - 1) {
holder.button.setVisibility(View.GONE);
}
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recyclerView.smoothScrollToPosition(position + 1);
}
});
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
@Override
public int getItemCount() {
return dataList.size();
}
public class RecyclerHolder extends RecyclerView.ViewHolder {
TextView textView;
Button button;
public RecyclerHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.item_text);
button = (Button) itemView.findViewById(R.id.item_button);
}
}
}
5.在activity文件中设置RecyclerView。
private RecyclerView recyclerView;
private LinearLayoutManager mRecyclerViewLayoutManager;
private RecyclerViewAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler); List<String> datas = new ArrayList<>();
datas.add("LiMing");
datas.add("XiaoMing");
datas.add("HanMeiMei"); mRecyclerViewLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(mRecyclerViewLayoutManager);
adapter = new RecyclerViewAdapter(this, datas);
recyclerView.setAdapter(adapter);
}
6.设置RecyclerView为水平方向。
mRecyclerViewLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
7.禁止手势滑动。
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
但是这样是有一个问题的,在item滑动的时候点击一下,item就会暂停住,不再滑动。
这个时候就需要处理一下这个问题,在item滑动的过程,不拦截点击事件,不滑动的时候拦截点击事件。
//position是RecyclerView的item的编号。
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG,"position = "+RecyclerViewAdapter.position);
if (isScroll) {
recyclerView.smoothScrollToPosition(RecyclerViewAdapter.position);
return false;
} else {
return true;
}
}
}); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == 2) {
isScroll = false;
}
if (newState == 1) {
isScroll = true;
}
if (newState == 0) {
isScroll = false;
}
} @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
}); @Override
protected void onDestroy() {
Log.d(TAG,"onDestroy()");
position = 0;
super.onDestroy();
}
项目的完整代码地址:https://github.com/ZhangMiao147/HorizontalRecyclerView
水平方向的RecyclerView的更多相关文章
- android 开发-设置控件/view的水平方向翻转
设置控件沿着水平方向翻转(即Y轴180°) 看效果: 代码: <pl.droidsonroids.gif.GifImageView android:id="@+id/gv_image1 ...
- Javascript技巧实例精选(2)—文字水平方向上动态漂移
>>点击这里下载html源文件代码<< 采用Javascript实现,文字水平方向上动态漂移 这是截图 这是相应的Javascript代码 <marquee behavi ...
- esyui datagrid 水平方向下方出来滚动条的原因是因为使用了同一列名
esyui datagrid 水平方向下方出来滚动条的原因是因为使用了同一列名
- html5水平方向重力感应
html5图片随手机重力感应而移动 <!DOCTYPE html> <html lang="zh-cn"><head><meta http ...
- 水平方向margin:auto
先上图 由图可看到,块级元素的水平方向上又"7大属性":margin-left.border-left.padding-left.margin-left.width.paddi ...
- CSS居中问题:块级元素和行级元素在水平方向以及垂直方向的居中问题
元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 块级元素 块级元素水平居中 1:marg ...
- 学习C:打印输入中单词长度的水平方向直方图
#include <stdio.h>#define IN 1#define OUT 0#define MAXWL 16 main() { /*打印输入单词长度的水平直方图*/ int c, ...
- 改变bootstarp图标水平方向
我一开始是以为bootstarp已经自定义了方向的类的,但是我查阅了好久都没有看到,我这里用的是CSS3的旋转180° 1:HTML <i class="icon-thumbs-dow ...
- ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法
一.上图 二.场景描写叙述 最近在做项目的时候.遇到一个怪异的需求,描写叙述例如以下: 1.ViewPager中嵌套3个View,当从View1滑动到View2时禁止ViewPager的滑动事件. 2 ...
随机推荐
- python自动化测试应用-番外篇--接口测试2
篇2 book-python-auto-test-番外篇--接口测试2 --lamecho辣么丑 大家好! 我是lamecho(辣么丑),今天将继续上一篇python接 ...
- linux 下启动程序的时候会显示坏的解释器,或者没有那个文件
又一次开发的时候在windowns上编写完的程序放到linux下运行的时候,比如:./start.sh的时候显示:"坏的解释器,没有那个文件"错误, 原因是windowns下写的s ...
- jquery的ajax与spring mvc对接注意事项
昨天一直纠结这么一个问题,应用场景是这样的: 这里登陆是通过jquery的ajax传输数据到后台controller类相应的映射mapping接收.本来是想,在后台验证成功之后返回一个视图modelA ...
- Java中Properties类
1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...
- abstract、virtual、sealed
abstract与virtual前必有public 1.abstract,抽象 1)只要使用到了abstract定义了方法,那么类就一定得用abstract定义,public abstract,只有抽 ...
- NSLog (Log信息的输出)
概述 NSLog是 cocoa的框架中提供的一个方法 NSLog的定义 NSLog定义在NSObjCRuntime.h中 NSLog与printf的差异 1)NSLog传递进去的格式化字符是NSStr ...
- 基于webpack2.x的vue2.x的多页面站点
vue的多页面 依旧使用vue-cli来初始化我们的项目 然后修改主要目录结构如下: ├── build │ ├── build.js │ ├── check-versions.js │ ...
- java下蛇形回环矩阵的实现
前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫"蛇形回环矩阵"......请大家直接看图1,就是那个样子的矩阵. 问题描述:输入一个N, ...
- c#枚举值增加特性说明
c#枚举值增加特性说明 通过特性给一个枚举类型每个值增加一个字符串说明,用于打印或显示. 自定义打印特性 [AttributeUsage(AttributeTargets.Field)] public ...
- 转:Centos6.5_x86安装Redis。
Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...