一、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 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