Android開發(fā)中RecyclerView item點(diǎn)擊(一)

通過Google和度娘的不懈努力书在,總結(jié)出6種方法(歡迎大家吐槽):
1.簡單粗暴心俗,Adapter中吠勘,直接在控件名后面setOnClickListener

            viewHolder.allItemHome.setOnClickListener(new SingleOnClickListener() {
                @Override
                public void onSingleClick(View v) {
                    
                }
            });

2.通過接口回調(diào)(有兩種寫法)
寫法一:
(1)自定義一個繼承自RecyclerView.Adapter的MyAdapter逸寓,在MyAdapter中定義如下接口,模擬ListView的OnItemClickListener:

    public static interface OnItemClickListener {
        void onItemClick(View view , int position);
    }

(2)聲明一個這個接口的變量

 private OnItemClickListener mOnItemClickListener = null;

(3)在onCreateViewHolder()中為每個item添加點(diǎn)擊事件

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        ViewHolder vh = new ViewHolder(view);
        //將創(chuàng)建的View注冊點(diǎn)擊事件
        view.setOnClickListener(this);
        return vh;
    }

(4)將點(diǎn)擊事件轉(zhuǎn)移給外面的調(diào)用者:

    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意這里使用getTag方法獲取position
            mOnItemClickListener.onItemClick(v,(int)v.getTag());
        }
    }

(5)注意上面調(diào)用接口的 onItemClick() 中的 v.getTag() 方法若治,這需要在onBindViewHolder()方法中設(shè)置和item的position

    @Override
    public void onBindViewHolder(ViewHolder viewHolder,  int position) {
        viewHolder.mTextView.setText(datas[position]);
        //將position保存在itemView的Tag中慨蓝,以便點(diǎn)擊時進(jìn)行獲取
        viewHolder.itemView.setTag(position);
    }

(6)最后暴露給外面的調(diào)用者,定義一個設(shè)置Listener的方法():

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

以上所有步驟都發(fā)生在自定義的adapter中端幼,典型的觀察者模式礼烈,有點(diǎn)繞的地方在于,這里涉及到兩個觀察者模式的使用婆跑,view的setOnClickListener本來就是觀察者模式济丘,我們將這個觀察者模式的事件監(jiān)聽傳遞給了我們自己的觀察者模式。
在Activity中使用

        mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
        //創(chuàng)建默認(rèn)的線性LayoutManager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        //如果可以確定每個item的高度是固定的洽蛀,設(shè)置這個選項(xiàng)可以提高性能
        mRecyclerView.setHasFixedSize(true);
        //創(chuàng)建并設(shè)置Adapter
        mAdapter = new MyAdapter(data);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new OnItemClickListener(){
            @Override    
            public void onItemClick(View view , int position){
                Toast.makeText(MainActivity.this, data[position], 600).show();
            }
        });

來自“泡在網(wǎng)上的日子”:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2647.html#commettop
方法二:
(1)(2)(6)和方法一相同,在Activity中使用也與方法一相同疟赊,剩下不同的地方:
在ViewHolder 中郊供,

    static class ViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.tv_name)
        TextView tvName;
        @Bind(R.id.tv_info)
        TextView tvInfo;
        @Bind(R.id.tv_money)
        TextView tvMoney;

        ViewHolder(View view) {
            super(view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemClickListener.onItemClick(view, getPosition());
                }
            });
            ButterKnife.bind(this, view);
        }
    }

3.是在google sample時看到的一種實(shí)現(xiàn)方式,很簡單近哟,而且很速度
(1)再Activity中

public class XmlImpItemClickActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RecyclerView recyclerView = new RecyclerView(this);
        setContentView(recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new Adapter());
    }

public void onItemClick(View view) {
        int childAdapterPosition = recyclerView.getChildAdapterPosition(view);
        Toast.makeText(XmlImpItemClickActivity.this, "item click index = "+childAdapterPosition, Toast.LENGTH_SHORT).show();
    }
}

(2)在Adapter中

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.xml_imp_click_item,parent,false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        TextView textView = (TextView) holder.itemView.findViewById(android.R.id.text1);
        textView.setText("item" + position);
    }

    @Override
    public int getItemCount() {
        return 50;
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

(3)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="50dp"
    android:orientation="vertical"
    android:onClick="onItemClick"
    android:background="?attr/selectableItemBackground">

    <TextView
        android:id="@android:id/text1"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

關(guān)鍵屬性android:onClick="onItemClick"驮审,此方法在Activity中申明并實(shí)現(xiàn)了。
這里簡單說下RecyclerView.getChildAdapterPosition()方法吉执,此方法可以獲取ItemView在Adapter中的位置疯淫,而我們onItemClick方法中的參數(shù)view剛好是我們點(diǎn)擊的ItemView,但有一個缺陷戳玫,那就是xml布局中設(shè)置的onClick只能在Activity中去實(shí)現(xiàn)熙掺,不能在Fragment中實(shí)現(xiàn)。
來自簡書:http://www.reibang.com/p/2bbb025be972

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕宿,一起剝皮案震驚了整個濱河市币绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌府阀,老刑警劉巖缆镣,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異试浙,居然都是意外死亡董瞻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門田巴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠糊,“玉大人挟秤,你說我怎么就攤上這事∶呗欤” “怎么了煞聪?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逝慧。 經(jīng)常有香客問我昔脯,道長,這世上最難降的妖魔是什么笛臣? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任云稚,我火速辦了婚禮,結(jié)果婚禮上沈堡,老公的妹妹穿的比我還像新娘静陈。我一直安慰自己,他們只是感情好诞丽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布鲸拥。 她就那樣靜靜地躺著,像睡著了一般僧免。 火紅的嫁衣襯著肌膚如雪刑赶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天懂衩,我揣著相機(jī)與錄音撞叨,去河邊找鬼。 笑死浊洞,一個胖子當(dāng)著我的面吹牛牵敷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播法希,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼枷餐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苫亦?” 一聲冷哼從身側(cè)響起尖淘,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎著觉,沒想到半個月后村生,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饼丘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年趁桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡卫病,死狀恐怖油啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟀苛,我是刑警寧澤益咬,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站帜平,受9級特大地震影響幽告,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裆甩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一冗锁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗤栓,春花似錦冻河、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堪澎,卻和暖如春擂错,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背全封。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桃犬,地道東北人刹悴。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像攒暇,于是被迫代替她去往敵國和親土匀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評論 25 707
  • 前一陣子形用,他一直和我說就轧,他想買輛電動車。我以為他只是說說田度。 今天放學(xué)回家妒御,我在樓梯口等他,他滿臉陽光燦爛镇饺。我看他那...
    八夭二閱讀 222評論 1 0
  • 為期五天的南明年度聚會結(jié)束了乎莉,精彩,刺激,震撼惋啃,更是感動哼鬓!感動于每個老師的精彩分享,感動于每位老師對待自己...
    孫帥SUNSHUAI閱讀 841評論 0 3
  • 每日別人在玩耍 我就要午休 午休總會做一個清奇的夢 所以仿佛別人過了1天 我卻過了2天 有時是孤獨(dú)的美食家 有時是...
    嗚啦嗚啦咔咔閱讀 439評論 0 4
  • 什么是成功边灭?成功是什么异希?怎么努力才能成功?如何做才能使自己成功绒瘦? 我一直在問自己怎么樣才能成功称簿? 成功。我要...
    新仔閱讀 332評論 0 1