您的位置:首页 > 其它

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息