Android前沿技術(shù)之 RecyclerView 類(lèi)型與點(diǎn)擊事件的用法(一)

Android中由于ListView和GridView功能的不健全京办,特別是列表緩存設(shè)置問(wèn)題是由我們自己去設(shè)置的惭婿,因此谷歌又添加了一個(gè)組件 RecyclerView财饥,這個(gè)組件非常強(qiáng)悍,可以同時(shí)實(shí)現(xiàn)列表和表格橫縱向排序沾瓦,還有瀑布流的展現(xiàn)谦炒,但是有個(gè)缺點(diǎn)就是沒(méi)有提供點(diǎn)擊事件給我們宁改,案例會(huì)給出还蹲,還有值得注意的是它放在 v7 包中,因此使用之前記得引入相關(guān)類(lèi)庫(kù)潭兽;話(huà)不多說(shuō)讼溺,開(kāi)搞:

一、添加 v7 包中所依賴(lài)的 RecyclerView 組件

右鍵 app 點(diǎn)后選擇 “Open Module Settings”藻懒,然后 "Dependencies"嬉荆,接下來(lái) “Library dependency”,然后選擇組件即可:
image.png
這里需要注意的是限番,組件版本必須要和我們環(huán)境的配置版本一樣弥虐,如圖:
image.png

二珠插、在布局文件中添加我們的組件:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

三捻撑、聲明相應(yīng)的組件及集合數(shù)據(jù)對(duì)象之后設(shè)置窗體源代碼如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initView(); // 初始化組件
        initData(); // 初始化數(shù)據(jù)
        setData();  // 適配器綁定數(shù)據(jù)

        setRvTypeAndListener(); //設(shè)置類(lèi)型組件及監(jiān)聽(tīng)事件

    }

四顾患、前三個(gè)方法的實(shí)現(xiàn)如下:

//初始化方法
private void initView() {
     setContentView(R.layout.activity_main);
     recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
}

//初始化數(shù)據(jù)的方法
private void initData() {
    datas = new ArrayList<>();
    //準(zhǔn)備數(shù)據(jù)
    for(int i = 0; i < 100; i++){
          datas.add("Content_"+ i);
    }
}

//設(shè)置適配器
private void setData() {
     //設(shè)置適配器
     adapter = new MyRecyclerViewAdapter(this, datas);
     recyclerView.setAdapter(adapter);
}

五、創(chuàng)建一個(gè)名為 MyRecyclerViewAdapter 并且使其 繼承自 RecyclerView 自身的適配器(注意:這里適配器泛型是存放 自定義內(nèi)部類(lèi)的組件容器):

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    private Context mContext;
    private List<String> datas;

    public MyRecyclerViewAdapter(Context mContext, List<String> datas) {
        this.mContext = mContext;
        this.datas = datas;
    }

    //相當(dāng)于 getView 方法中創(chuàng)建 View 和 ViewHolder
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = View.inflate(mContext, R.layout.item_recyclerview, null);

        return new MyViewHolder(itemView);
    }

    //數(shù)據(jù) 和 View綁定 训堆,相當(dāng)于 getView 綁定數(shù)據(jù)部分的代碼
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        //根據(jù)位置得到對(duì)應(yīng)的數(shù)據(jù)
        String data = datas.get(position);
        holder.tv_title.setText(data);
    }

    //得到總條數(shù)
    @Override
    public int getItemCount() {
        return datas.size();
    }

    //內(nèi)部組件容器類(lèi)
    class MyViewHolder extends RecyclerView.ViewHolder {

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

    }


}

六描验、創(chuàng)建出 item_recyclerview.xml 選項(xiàng)文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:padding="5dp"
    android:background="#fff">

    <LinearLayout
        android:padding="5dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="#22000000">

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher"/>

        <TextView
            android:id="@+id/tv_title"
            android:layout_marginLeft="30dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Content"
            android:textAllCaps="false"
            android:textColor="#000000"/>

    </LinearLayout>

</RelativeLayout>

七、將內(nèi)部容器類(lèi)修改如下:

class MyViewHolder extends RecyclerView.ViewHolder {

        private ImageView iv_icon;
        private TextView tv_title;

        public MyViewHolder(View itemView) {
            super(itemView);
            iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);

        }

 }

八坑鱼、接下來(lái)我們實(shí)現(xiàn) setRvTypeAndListener() 方法 <如不設(shè)置此方法中的代碼則組件無(wú)法顯示數(shù)據(jù)>:

    //設(shè)置組件的樣式
    private void setRvTypeAndListener() {
        //LayoutManager 設(shè)置樣式組件
        //設(shè)置成 列表
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文膘流、方向、是否倒序
        //recyclerView.scrollToPosition(datas.size()-1);  //指定顯示的位置

        //設(shè)置成表格
        //recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文鲁沥、列數(shù)呼股、方向、是否倒序
        //recyclerView.scrollToPosition(datas.size()-1);

        //設(shè)置成瀑布流
        //recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列數(shù)画恰、方向

    }


運(yùn)行效果圖如下(注:可自行修改顯示格式):


image.png

九、由于 RecyclerView 不想 ListView 和 GridView 那樣有自帶的點(diǎn)擊事件狭园,因此點(diǎn)擊事件必須要由我們自己去設(shè)置,我們直接在 MyViewHolder 構(gòu)造方法中為 選項(xiàng)對(duì)象設(shè)置點(diǎn)擊事件即可:

    public MyViewHolder(View itemView){
            super(itemView);
            iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);

            //添加點(diǎn)擊事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, "當(dāng)前點(diǎn)擊 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();

                }
            });

      }

我們運(yùn)行程序效果如下:


image.png

十粥脚、當(dāng)然铭拧,如果覺(jué)得在適配器里設(shè)置比較麻煩不夠靈活的話(huà)即我們想使用 適配器對(duì)象 設(shè)置呕臂,那如何實(shí)現(xiàn)呢?很簡(jiǎn)單谜洽,我們?cè)谶m配器里定義接口蚌卤,然后回調(diào)出去即可實(shí)現(xiàn)我們的點(diǎn)擊事件咸灿,在適配器里 創(chuàng)建內(nèi)部的 接口及 回調(diào)方法 :

    //點(diǎn)擊 RecyclerView 某條的監(jiān)聽(tīng)
    public interface OnItemClickListener{

        /**
         * 當(dāng)RecyclerView某個(gè)被點(diǎn)擊的時(shí)候回調(diào)
         * @param view 點(diǎn)擊item的視圖
         * @param data 點(diǎn)擊得到的數(shù)據(jù)
         */
        void onItemClick(View view, String data);

    }

    private OnItemClickListener onItemClickListener;

    /**
     * 設(shè)置RecyclerView某個(gè)的監(jiān)聽(tīng)
     * @param onItemClickListener
     */
    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }

十一囊榜、定義好之后,我們將選項(xiàng)對(duì)象的點(diǎn)擊事件修改如下:

            //添加點(diǎn)擊事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Toast.makeText(mContext, "當(dāng)前點(diǎn)擊 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();

                    if(onItemClickListener != null){
                        onItemClickListener.onItemClick(v, datas.get(getLayoutPosition()));

                    }

                }
            });


十二、然后返回源文件并將 setRvTypeAndListener() 方法做如下修改即可:

    //設(shè)置組件的樣式
    private void setRvTypeAndListener() {
        //LayoutManager 設(shè)置樣式組件
        //設(shè)置成 列表
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文、方向、是否倒序
        //recyclerView.scrollToPosition(datas.size()-1);

        //設(shè)置成表格
        //recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文挣菲、列數(shù)椭赋、方向、是否倒序
        //recyclerView.scrollToPosition(datas.size()-1);

        //設(shè)置成瀑布流
       // recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列數(shù)认境、方向


        adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, String data) {
                Toast.makeText(MainActivity.this, "點(diǎn)擊-> "+ data, Toast.LENGTH_SHORT).show();
            }
        });

    }

運(yùn)行效果如下:


image.png
值得注意的是:如果我們給選項(xiàng)添加長(zhǎng)按事件或者為某個(gè)組件添加點(diǎn)擊事件而已的話(huà)硼身,其做法和剛剛剛設(shè)置的 點(diǎn)擊事件 一個(gè)原理,在適配器中做相應(yīng)的設(shè)置即可....
好了,這個(gè)案例就寫(xiě)到這里巍糯,順便附上源碼 - >

鏈接:https://pan.baidu.com/s/1rwaoesCMprS36qz9NNZxnQ 密碼:pti7

有疑問(wèn)可隨時(shí)留言哦a阌恪Q嵫谩!嘿嘿喻杈。。盟猖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末固蚤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子禽作,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乎赴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)踢匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)输莺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丈冬,“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了重抖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咖祭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任码耐,我火速辦了婚禮伐坏,結(jié)果婚禮上每瞒,老公的妹妹穿的比我還像新娘。我一直安慰自己浓利,他們只是感情好渴语,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布调违。 她就那樣靜靜地躺著且轨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玷过。 梳的紋絲不亂的頭發(fā)上粤蝎,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天桑谍,我揣著相機(jī)與錄音贞间,去河邊找鬼胧辽。 笑死础浮,一個(gè)胖子當(dāng)著我的面吹牛奠骄,可吹牛的內(nèi)容都是我干的佳晶。 我是一名探鬼主播轿秧,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凸克,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撞鹉!你這毒婦竟也來(lái)了又活?” 一聲冷哼從身側(cè)響起杯聚,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抒痒,沒(méi)想到半個(gè)月后幌绍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡故响,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纷捞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被去。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奖唯,靈堂內(nèi)的尸體忽然破棺而出惨缆,到底是詐尸還是另有隱情,我是刑警寧澤丰捷,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布坯墨,位于F島的核電站,受9級(jí)特大地震影響病往,放射性物質(zhì)發(fā)生泄漏捣染。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一停巷、第九天 我趴在偏房一處隱蔽的房頂上張望耍攘。 院中可真熱鬧,春花似錦畔勤、人聲如沸蕾各。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)式曲。三九已至,卻和暖如春缸榛,著一層夾襖步出監(jiān)牢的瞬間吝羞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工内颗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钧排,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓均澳,卻偏偏與公主長(zhǎng)得像卖氨,于是被迫代替她去往敵國(guó)和親会烙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,727評(píng)論 22 665
  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 307,424評(píng)論 27 439
  • 可能是現(xiàn)實(shí)吧 逼著我們嘗試著這個(gè)年紀(jì)不該有的成熟
    你十八閱讀 117評(píng)論 0 0
  • 當(dāng)清晨的第一縷陽(yáng)光照進(jìn)房間筒捺,一切都那么安詳柏腻。 “他們會(huì)是誰(shuí)呢?”一個(gè)少年躺在床上心中暗暗想著系吭。 “唐曉五嫂!起床啦!”...
    茉路晨曦閱讀 268評(píng)論 0 0