1. 程式人生 > >通過介面回撥方式來設定RecyclerView的條目點選監聽事件

通過介面回撥方式來設定RecyclerView的條目點選監聽事件

提到RecyclerView大家總會拿它與ListView相比較, RecyclerView是具有比ListView更具擴充套件性的控制元件, RecyclerView繼承的是ViewGroup, 可以說也是ViewGroup的官方定義控制元件, RecyclerView顧名思義其專注於Recycler複用, 它不再管理佈局, RecyclerView的佈局由LayoutManager來管理了, Adapter的使用也不再像ListView那樣繼承BaseAdapter, 而是繼承其內部類的RecyclerView.Adapter, 它是一個泛型類, 通常我們喜歡把它的泛型設定為RecyclerView.ViewHolder, RecyclerView.ViewHolde顯然也是一個RecyclerView的內部類, 可見RecyclerView已經把Adapter和ViewHolder完全封裝成自己的內部類, 其高度的Recycler思想可想而知.

RecyclerView的使用通常會涉及到一下幾個方法:

// 1.配置效率
mRecyclerView.setHasFixedSize(true);

// 2.配置佈局
mRecyclerView.setLayoutManager(new  LinearLayoutManager(this));

// 3.配置Adapter
mCustomAdapter = new CustomAdapter(this, mDatas);
mRecyclerView.setAdapter(mCustomAdapter);

發現並沒有像ListView那樣直接設定條目點選監聽的方法, 如何實現RecyclerView的條目點選監聽呢?這裡採用介面回撥的方式實現;

先看RecyclerView的Adapter程式碼

package com.suosuoshu.recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

// 自定義CustomAdapter 繼承RecyclerView.Adapter
public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<Student> mDatas; // 採用介面回撥的方式實現RecyclerView的ItemClick public OnRecyclerViewListener mOnRecyclerViewListener; // 介面回撥第一步: 定義介面和介面中的方法 interface OnRecyclerViewListener { void onItemClick(int position); boolean onItemLongClick(int position); } // 介面回撥第二步: 初始化介面的引用 public void setOnRecyclerViewListener(OnRecyclerViewListener l) { this.mOnRecyclerViewListener = l; } public CustomAdapter(Context context, List<Student> datas) { mContext = context; mDatas = datas; } // 自定義ViewHolder public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { public final TextView mTextName; public final TextView mTextAge; // 注意這裡的position與CustomViewHolder是對應的關係, 每個CustomViewHolder都有mTextName和mTextAge, 還有它的mPosition public int mPosition; public CustomViewHolder(View itemView) { super(itemView); mTextName = (TextView) itemView.findViewById(R.id.name); mTextAge = (TextView) itemView.findViewById(R.id.age); // 巧妙的呼叫了View的點選方法 itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); } // 介面回撥第三步, 實現onClick, 方法中是呼叫了介面的onItemClick抽象方法, 所以這裡之後肯定會被回調回來 @Override public void onClick(View v) { if (mOnRecyclerViewListener != null) { mOnRecyclerViewListener.onItemClick(mPosition); } } @Override public boolean onLongClick(View v) { if (mOnRecyclerViewListener != null) { return mOnRecyclerViewListener.onItemLongClick(mPosition); } return false; } } // RecyclerView.Adapter的三個抽象方法實現 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.itme_layout, null); CustomViewHolder customViewHolder = new CustomViewHolder(view); return customViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { CustomViewHolder customViewHolder = (CustomViewHolder) holder; customViewHolder.mTextName.setText(mDatas.get(position).name); customViewHolder.mTextAge.setText(mDatas.get(position).age); customViewHolder.mPosition = position; } @Override public int getItemCount() { return mDatas != null ? mDatas.size() : 0; } }

這是MainActivity 中的程式碼

package com.suosuoshu.recyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements CustomAdapter.OnRecyclerViewListener {

    private RecyclerView mRecyclerView;
    private List<Student> mDatas;
    private CustomAdapter mCustomAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
    }
    // 初始化控制元件
    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    }
    // 初始化資料
    private void initData() {
    // 這裡是模擬資料
        mDatas = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            Student student = new Student("明明", "18");
            mDatas.add(student);
        }

        // 1.配置效率
        mRecyclerView.setHasFixedSize(true);

        // 2.配置佈局
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 3.配置Adapter
        mCustomAdapter = new CustomAdapter(this, mDatas);
        mRecyclerView.setAdapter(mCustomAdapter);

        // 4.注意, 是讓Adapter去設定點選監聽事件,setOnRecyclerViewListener方法是在CustomAdapter中定義的
        mCustomAdapter.setOnRecyclerViewListener(this);
    }

// 介面回撥第四步, 這是才是最終被呼叫的方法
    @Override
    public void onItemClick(int position) {
        Toast.makeText(MainActivity.this, "點選了第" + position + "個條目", Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClick(int position) {
        return false;
    }
}

一個簡單的Bean類模擬資料

package com.suosuoshu.recyclerview;
public class Student {
    public String name;
    public String age;

    public Student(String name, String age) {
        this.name = name;
        this.age = age;
    }
}

相關推薦

通過介面方式設定RecyclerView條目事件

提到RecyclerView大家總會拿它與ListView相比較, RecyclerView是具有比ListView更具擴充套件性的控制元件, RecyclerView繼承的是ViewGroup, 可以說也是ViewGroup的官方定義控制元件, Recycle

設定事件

我們在寫監聽事件時,往往是 mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(Vie

Android通過介面實現資料更新(Kotlin版)

最近開發一個專案,用的是kotlin,本人kotlin水平有限,還請諒解,需要在fragment修改資料,然後更新到activity中,我使用介面回撥來完成這個需求。 先上一張圖來看一下 修改完暱稱,不僅要在fragment裡更新資料,還要同步更新act

Adapter與Activity通過介面進行互動

0. 前言 首先說明一下為什麼要寫這麼一篇部落格:最近看了一些其他人的專案,發現很多專案的做法是建立一個專門存放Adapter類的Package包,也有的專案乾脆直接都寫在Activity中。而我屬於

Activity與Fragment通過介面進行通訊

介面回撥在Android中有很多的應用,比如Activity裡的onCreat、onDestroy等方法,按鍵事件監聽。Android對Fragment的是在Android3.0時加入的,所以Android3.0  以前的系統並不支援Fragment,而為了使3.0以前的

Android在BroadcastReceiver中通過介面更新介面

之前寫廣播接收器都是寫在Activity的內部的,覺得看起來很亂的感覺,畢竟廣播也事和活動是同一級別的元件之一,哪兒能放在活動的裡面啊,決定就來封裝一下,發現居然沒有思路,,同事說用靜態類,直接點就可以了, 但是靜態類在記憶體中不會被回收,只有等程式結束後才會回收,所以決

RecyclerView條目和長按

   RecyclerView雖然很強大,但是沒有點選事件,美中不足!所以需要自己寫點選事件啦。    Activity介面 public class MainActivity extends AppCompatActivity { pr

RecyclerView中單個item裡面的子檢視的

資料來源:datas = new ArrayList<>(); for (int i = 0; i < 200; i++) { datas.add("aaaaa" + i); }RecyclerV

spannablestring用在fragment中,設定無效

主要程式碼如下         @Override         public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {             super.onViewCr

Android RecyclerView (三)初學,為RecyclerView新增Item

前兩篇文章講述瞭如何基本的使用RecyclerView呈現出自己想要的效果,但是我好奇的是,為什麼RecyclerView沒有.SetOnClick之類的方法呢,RecyclerView不得不承認,它是一款很強大的軟體,僅僅幾行程式碼就可以切換出自己想要的佈局,

Java--對接微信第五篇之底部選單按鈕url設定(通過按鈕獲取openid)

在上一篇的基礎上,有一個地方是需要去微信公眾平臺設定的(如果你這個url需要獲取使用者openid的話!如果不需要獲取可以無視) 登入微信公眾平臺-->公眾號設定-->選擇功能設定-->設定網頁授權域名(為微信認為安全的地址,不用精確到方法,但是你需要將一個文字金鑰放入對應

RecyclerView---條目---介面

activity_main <Button android:id="@+id/add" android:layout_width="0dp" android:layout_height="wrap_content" android:layout

RecyclerView +介面

需要的依賴 com.android.support:recyclerview-v7:28.0.0 MainActivity import android.os.Bundle; import android.support.v7.app.AppCompatActivity;

Android : Recyclerview的使用以及介面

先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.v7.widget

Recyclerview的使用以及介面

先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.

RecyclerView(介面,自定義)

依賴 implementation 'com.android.support:recyclerview-v7:27.1.1' MainActivity程式碼 呼叫介面卡,傳值 public class MainActivity extends AppCompa

Fragment學習之使用介面方式實現Fragment與Activity通訊

Fragment與Fragment之間可以進行資訊傳遞,同樣,Fragment與Activity也可以進行資訊的傳遞。 下面是一個演示在Activity中獲取來自Fragment的資訊,使用介面回撥的方法在Activity中接收資訊 MainActivity.java:

介面,用最簡單的一個匿名內部類講解(附介面高階應用場景,讓你對介面的瞭解登堂入室)

介面回撥,是Java開發者必須要學的一個東西,可是他呢,書上沒有,大神部落格裡也沒有,所以導致了有部分小夥紙並不瞭解這個知識,所以這裡做一個最簡單的講解。 (先不牽扯什麼非同步回撥、同步回撥) 首先,只需要記住一點,介面回撥的含義就是把程式碼換個地方寫。 正常我們是這

Android中Recyclerview使用7----條目中按鈕事件,在activity中呼叫(介面)

0引入Recyclerview的支援庫    compile 'com.android.support:recyclerview-v7:23.4.0' 1效果圖: 2程式碼: 2.1MainActivity中: <span style="font-size:18p

介面實現RecyclerView條目事件

1.介面卡中新增如下程式碼 public interface OnItemClickListener { public void onItemClick(int postion); } OnItemClickListener mClickListener; pu