RecyclerView添加Item的监听
2018-01-17 11:29
253 查看
一、RecyclerView添加Item的监听
1.按正常做法写完RecyclerView的adapter;
2.在adapter类中添加2个接口
public interface
MyItemClickListener {
public void
onItemClick(View view, int
position);
}
public interface MyItemLongClickListener {
public void
onItemLongClick(View view, int
position);
}
3.在adapter的ViewHolder类的构造器形参列表里加入这2个变量,并接收作为成员变量,为itemView设置点击或长按事件的监听。
class
MyHolder extends
RecyclerView.ViewHolder implements
View.OnClickListener, View.OnLongClickListener {
private
TextView tv_item_recycler_view;
private
MyItemClickListener mClickListener;
private
MyItemLongClickListener mLongClickListener;
public
MyHolder(View itemView, MyItemClickListener clickListener, MyItemLongClickListener longClickListener) {
super(itemView);
tv_item_recycler_view
= (TextView) itemView.findViewById(R.id.tv_item_recycler_view);
mClickListener
= clickListener;
mLongClickListener
= longClickListener;
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
@Override
public void
onClick(View v) {
if
(mClickListener
!= null) {
mClickListener.onItemClick(v, getPosition());
}
}
@Override
public boolean
onLongClick(View v) {
if
(mLongClickListener
!= null) {
mLongClickListener.onItemLongClick(v, getPosition());
}
return true;
}
}
4.这时,onCreateViewHolder()方法中肯定要报错,因为new的MyHolder的实参列表中少了2个参数。在adapter类中添加2个接口的对象(这里不能叫对象)作为成员变量,放到MyHolder的参数列表中,并为它们设置set方法
private
MyItemClickListener mItemClickListener;
private MyItemLongClickListener
mItemLongClickListener;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(mContext).inflate
(R.layout.item_recycler_view, parent,
false);
return new
[/b]MyHolder(view,mItemClickListener,
mItemLongClickListener);
}
public void setOnItemClickListener(MyItemClickListener clickListener){
this.mItemClickListener
= clickListener;
}
public void setOnItemLongClickListener(MyItemLongClickListener longClickListener){
this.mItemLongClickListener
= longClickListener;
}
5.在Activity类中设置LayoutManager和adapter后就可以用adapter的对象调用方法为RecyclerView的Item设置监听了
private void
initView() {
recycler_view_main
= (RecyclerView)findViewById
(R.id.recycler_view_main);
}
private void
initData() {
for
(int
i = 0; i <
50; i++) {
datas.add("今日阳光明媚"
+ i);
}
recycler_view_main.setLayoutManager(new
LinearLayoutManager(this, LinearLayoutManager.VERTICAL,
false));
RecyclerViewAdapter recyclerViewAdapter =
new RecyclerViewAdapter(this,datas);
recycler_view_main.setAdapter(recyclerViewAdapter);
recyclerViewAdapter.setOnItemClickListener(this);
recyclerViewAdapter.setOnItemLongClickListener(this);
}
6.需要Activity类实现RecyclerViewAdapter的MyItemClickListener和MyItemLongClickListener这2个接口,并实现对应的2个抽象方法
@Override
public void onItemClick(View view,
int position) {
Toast.makeText(MainActivity.this,
"单击---position=="
+ position, Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view,
int position) {
Toast.makeText(MainActivity.this,
"长按------position=="
+ position, Toast.LENGTH_SHORT).show();
}
在实现的方法里就可以写我们自己的逻辑了,我在这里只做了吐司。
二、快速添加头部
例如有如下布局:
<?xml version="1.0"
encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
/>
<com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader
android:id="@+id/rvh_main_header"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="center_horizontal|top">
<ImageView
android:id="@+id/iv_main_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"
/>
</com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader>
</FrameLayout>
如果不将ImageView添加成RecyclerView的头布局,它是不会跟着RecyclerView一起滑动的。若想添加成头布局,我们要先集成一个第三方框架RecyclerViewHeader。
这个框架中有library和一个sample,要先一起集成到我们的项目中,需要调一下build.gradle文件:
def cfg = rootProject.ext.configuration
def libs = rootProject.ext.libraries
apply from: '../gradle-mvn-push.gradle'
上边这些都注释掉,
android {
compileSdkVersion cfg.compileVersion
buildToolsVersion cfg.buildToolsVersion
defaultConfig {
minSdkVersion cfg.minSdk
targetSdkVersion cfg.targetSdk
versionCode cfg.versionCode
versionName cfg.versionName
}
这些换成下边的,要和自己项目的版本统一
android {
compileSdkVersion 23
buildToolsVersion
"23.0.3"
defaultConfig {
minSdkVersion 15
targetSdkVersion
23
versionCode
1
versionName
"1.0"
}
这些也要替换成自己的版本
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
provided "com.android.support:recyclerview-v7:${libs.support}"
}
如下:
dependencies {
compile fileTree(dir:
'libs',
include: ['*.jar'])
provided "com.android.support:recyclerview-v7:23.4.0"
}
调完之后把library改个名字,把sample干掉就可以了,我们只需要库。将library关联到自己的项目中,就可以把RecyclerViewHeader控件包裹到要添加成头布局的控件外边了。
<com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader
android:id="@+id/rvh_main_header"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="center_horizontal|top">
<ImageView
android:id="@+id/iv_main_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"
/>
</com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader>
总的布局最好用FramLayout。
初始化控件后,用头布局控件调用attachTo()方法
rvh_main_header.attachTo(recycler_view_main);
注意:RecyclerViewHeader必须在RecyclerView设置了LayoutManager之后调用。
目前该库适用于LinearLayoutManager,GridLayoutManager和StaggeredGridLayoutManager布局的RecyclerViews。
只支持垂直布局LayoutManager
1.按正常做法写完RecyclerView的adapter;
2.在adapter类中添加2个接口
public interface
MyItemClickListener {
public void
onItemClick(View view, int
position);
}
public interface MyItemLongClickListener {
public void
onItemLongClick(View view, int
position);
}
3.在adapter的ViewHolder类的构造器形参列表里加入这2个变量,并接收作为成员变量,为itemView设置点击或长按事件的监听。
class
MyHolder extends
RecyclerView.ViewHolder implements
View.OnClickListener, View.OnLongClickListener {
private
TextView tv_item_recycler_view;
private
MyItemClickListener mClickListener;
private
MyItemLongClickListener mLongClickListener;
public
MyHolder(View itemView, MyItemClickListener clickListener, MyItemLongClickListener longClickListener) {
super(itemView);
tv_item_recycler_view
= (TextView) itemView.findViewById(R.id.tv_item_recycler_view);
mClickListener
= clickListener;
mLongClickListener
= longClickListener;
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
@Override
public void
onClick(View v) {
if
(mClickListener
!= null) {
mClickListener.onItemClick(v, getPosition());
}
}
@Override
public boolean
onLongClick(View v) {
if
(mLongClickListener
!= null) {
mLongClickListener.onItemLongClick(v, getPosition());
}
return true;
}
}
4.这时,onCreateViewHolder()方法中肯定要报错,因为new的MyHolder的实参列表中少了2个参数。在adapter类中添加2个接口的对象(这里不能叫对象)作为成员变量,放到MyHolder的参数列表中,并为它们设置set方法
private
MyItemClickListener mItemClickListener;
private MyItemLongClickListener
mItemLongClickListener;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(mContext).inflate
(R.layout.item_recycler_view, parent,
false);
return new
[/b]MyHolder(view,mItemClickListener,
mItemLongClickListener);
}
public void setOnItemClickListener(MyItemClickListener clickListener){
this.mItemClickListener
= clickListener;
}
public void setOnItemLongClickListener(MyItemLongClickListener longClickListener){
this.mItemLongClickListener
= longClickListener;
}
5.在Activity类中设置LayoutManager和adapter后就可以用adapter的对象调用方法为RecyclerView的Item设置监听了
private void
initView() {
recycler_view_main
= (RecyclerView)findViewById
(R.id.recycler_view_main);
}
private void
initData() {
for
(int
i = 0; i <
50; i++) {
datas.add("今日阳光明媚"
+ i);
}
recycler_view_main.setLayoutManager(new
LinearLayoutManager(this, LinearLayoutManager.VERTICAL,
false));
RecyclerViewAdapter recyclerViewAdapter =
new RecyclerViewAdapter(this,datas);
recycler_view_main.setAdapter(recyclerViewAdapter);
recyclerViewAdapter.setOnItemClickListener(this);
recyclerViewAdapter.setOnItemLongClickListener(this);
}
6.需要Activity类实现RecyclerViewAdapter的MyItemClickListener和MyItemLongClickListener这2个接口,并实现对应的2个抽象方法
@Override
public void onItemClick(View view,
int position) {
Toast.makeText(MainActivity.this,
"单击---position=="
+ position, Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view,
int position) {
Toast.makeText(MainActivity.this,
"长按------position=="
+ position, Toast.LENGTH_SHORT).show();
}
在实现的方法里就可以写我们自己的逻辑了,我在这里只做了吐司。
二、快速添加头部
例如有如下布局:
<?xml version="1.0"
encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
/>
<com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader
android:id="@+id/rvh_main_header"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="center_horizontal|top">
<ImageView
android:id="@+id/iv_main_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"
/>
</com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader>
</FrameLayout>
如果不将ImageView添加成RecyclerView的头布局,它是不会跟着RecyclerView一起滑动的。若想添加成头布局,我们要先集成一个第三方框架RecyclerViewHeader。
这个框架中有library和一个sample,要先一起集成到我们的项目中,需要调一下build.gradle文件:
def cfg = rootProject.ext.configuration
def libs = rootProject.ext.libraries
apply from: '../gradle-mvn-push.gradle'
上边这些都注释掉,
android {
compileSdkVersion cfg.compileVersion
buildToolsVersion cfg.buildToolsVersion
defaultConfig {
minSdkVersion cfg.minSdk
targetSdkVersion cfg.targetSdk
versionCode cfg.versionCode
versionName cfg.versionName
}
这些换成下边的,要和自己项目的版本统一
android {
compileSdkVersion 23
buildToolsVersion
"23.0.3"
defaultConfig {
minSdkVersion 15
targetSdkVersion
23
versionCode
1
versionName
"1.0"
}
这些也要替换成自己的版本
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
provided "com.android.support:recyclerview-v7:${libs.support}"
}
如下:
dependencies {
compile fileTree(dir:
'libs',
include: ['*.jar'])
provided "com.android.support:recyclerview-v7:23.4.0"
}
调完之后把library改个名字,把sample干掉就可以了,我们只需要库。将library关联到自己的项目中,就可以把RecyclerViewHeader控件包裹到要添加成头布局的控件外边了。
<com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader
android:id="@+id/rvh_main_header"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="center_horizontal|top">
<ImageView
android:id="@+id/iv_main_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"
/>
</com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader>
总的布局最好用FramLayout。
初始化控件后,用头布局控件调用attachTo()方法
rvh_main_header.attachTo(recycler_view_main);
注意:RecyclerViewHeader必须在RecyclerView设置了LayoutManager之后调用。
目前该库适用于LinearLayoutManager,GridLayoutManager和StaggeredGridLayoutManager布局的RecyclerViews。
只支持垂直布局LayoutManager
相关文章推荐
- 给RecyclerView的item添加点击监听事件
- 给RecyclerView的item添加点击监听事件
- Android RecyclerView (三)初学,为RecyclerView添加Item点击监听。
- 利用ItemDecoration给RecyclerView的item添加标题
- 为RecyclerView添加item的点击事件
- RecyclerView使用(二)多种Item布局、添加点击事件
- Android RecyclerView使用(二) -给Item添加点击事件
- RecyclerView加载不同item并实现其item点击事件,实现添加常用应用的功能
- Android RecyclerView给Item添加点击事件
- RecyclerView 给Item添加点击事件
- 为RecyclerView添加item的点击事件(个人备忘录)
- RecyclerView的Item监听
- [Android | Material Design] RecyclerView Item点击事件 添加水波纹效果 两种办法
- 一个能一句话添加header和Footer,并且能滑动删除和交换Item的RecyclerView
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- RecyclerView添加多个样式不同的Item布局
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- RecyclerView 添加头部和尾部,并实现Item的点击事件