打造優(yōu)美列表布局——基礎(chǔ)篇

最近學(xué)習(xí)使用第三方LayoutManager實(shí)現(xiàn)了優(yōu)美的圖書(shū)列表驱证,記錄下我的學(xué)習(xí)歷程冷离,同時(shí)寫(xiě)給學(xué)弟學(xué)習(xí)使用愿棋。為此我分成了基礎(chǔ)和進(jìn)階篇招盲,基礎(chǔ)篇主要講利用RecyclerView實(shí)現(xiàn)我們的列表展示扭屁,主要涉及到的知識(shí)是RecyclerView的使用和自定義item點(diǎn)擊事件算谈。進(jìn)階篇講解怎么利用開(kāi)源的LayoutManager實(shí)現(xiàn)優(yōu)美的圖書(shū)展示頁(yè)面。

本次的大綱

  • 1.1 RecyclerView的基礎(chǔ)使用

    • 1.1.1 RecyclerView的使用之前的配置
    • 1.1.2 RecyclerView的創(chuàng)建
    • 1.1.3 RecyclerView Adapter的使用
    • 1.1.4 LayoutManager的使用
  • 1.2 自定義item點(diǎn)擊事件

1.1 RecyclerView的基礎(chǔ)使用

1.1.1 RecyclerView的使用之前的配置

RecyclerView是support-v7包的一個(gè)列表控件料滥,它相比ListView使用起來(lái)更加靈活然眼,RecyclerView支持添加item增加、刪除動(dòng)畫(huà)葵腹,自定義item分割線等等高級(jí)功能高每。
要使用RecyclerView要導(dǎo)入v7包,在build.gradle包添加如下代碼

compile 'com.android.support:recyclerview-v7:25.3.0'

1.1.2 RecyclerView的創(chuàng)建

使用RecyclerView很簡(jiǎn)單践宴,在布局文件里面添加代碼

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

1.1.3 RecyclerView Adapter的使用

RecyclerView有自己的Adapter鲸匿,我們創(chuàng)建一個(gè)MyRecyclerViewAdapter類(lèi)來(lái)繼承RecyclerView.Adapter。
重寫(xiě)所需方法如下

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

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

    }

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

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}
onCreateViewHolder(ViewGroup parent, int viewType) 創(chuàng)建ViewHolder
onBindViewHolder(MyViewHolder holder, int position) 綁定ViewHolder

沒(méi)有用過(guò)RecyclerView或者沒(méi)有對(duì)ListView進(jìn)行優(yōu)化處理的可能不知道ViewHolder是什么阻肩,簡(jiǎn)單來(lái)說(shuō)ViewHolder就是一個(gè)持有者類(lèi)带欢,利用ViewHolder把我們item里面的View包裝起來(lái),就不需要再像每次BaseAdapter里的getView方法執(zhí)行的時(shí)候綁定每個(gè)View的id磺浙,實(shí)現(xiàn)列表的加載的優(yōu)化洪囤。

我們來(lái)完善我們的Adapter,為了簡(jiǎn)單演示撕氧,我們item只包含一個(gè)TextView并居中瘤缩。修改MyRecyclerViewAdapter代碼

   public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
       private List<String> mList = new ArrayList<>();
       private Context context;
   
       public MyRecyclerViewAdapter(Context context) {
           this.context = context;
       }
       public void setList(List<String> mList){
           this.mList.addAll(mList);
           notifyDataSetChanged();
       }
   
       @Override
       public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
           MyViewHolder holder = new MyViewHolder(
                   LayoutInflater.from(context).inflate(R.layout.item,parent,false));//創(chuàng)建ViewHolder
           return holder;
       }
   
       @Override
       public void onBindViewHolder(MyViewHolder holder, int position) {
           holder.textView.setText(mList.get(position));//給TextView設(shè)置文字
       }
   
       @Override
       public int getItemCount() {
           return mList.size();
       }
   
       class MyViewHolder extends RecyclerView.ViewHolder{
           TextView textView;
   
           public MyViewHolder(final View itemView) {
               super(itemView);
               textView = (TextView) itemView.findViewById(R.id.textView);
           }
       }
   }

1.1.4 LayoutManager的使用

RecyclerView跟listView不一樣,listView使用簡(jiǎn)單但是會(huì)有很多限制伦泥,而RecyclerView沒(méi)有太多限制剥啤,所以使用起來(lái)好多代碼需要我們自己定義锦溪,就相當(dāng)于RecyclerView只提供給你一個(gè)控件,其他的他什么也不管府怯。
ListView setAdapter 之后就可以使用刻诊,RecyclerView需要一個(gè)LayoutManager來(lái)控制顯示列表的樣式。在這里我就用普通的線性布局(水平牺丙、垂直)來(lái)實(shí)現(xiàn)列表的排布则涯,下一節(jié)演示使用來(lái)源LayoutManager實(shí)現(xiàn)高雅列表布局。

初始化LayoutManager并設(shè)置給RecyclerView

RecyclerView.LayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(manager);

LinearLayoutManager 的第二個(gè)參數(shù)設(shè)置水平(HORIZONTAL)與垂直(VERTICAL)冲簿。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView  = (RecyclerView) findViewById(R.id.recyclerView);
        adapter = new MyRecyclerViewAdapter(this);
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        adapter.setList(list);
        RecyclerView.LayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(adapter);
    }

可以看到粟判,連分割線都沒(méi)有,正如我所說(shuō)的峦剔,RecyclerView不跟你多提供其他東西档礁,RecyclerView的分割線也可以自己定義,這就比listview靈活得多吝沫,想要炫酷的效果你就要自己去寫(xiě)代碼呻澜。

1.2 自定義item點(diǎn)擊事件

item的點(diǎn)擊事件需要我們自己寫(xiě)接口實(shí)現(xiàn),在Adapter里面添加:

private interface onRecyclerViewOnClickListener{
    void onClick(View view,int position);
}
private onRecyclerViewOnClickListener listener;

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

我自定義一個(gè)onRecyclerViewOnClickListener的接口惨险,提供一個(gè)onClick的抽象方法羹幸。并且給Adapter添加一個(gè)setOnItemClickListener方法。
然后在MyViewHolder里面添加外部點(diǎn)擊事件平道,來(lái)處理我們的接口方法睹欲。

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView textView;

    public MyViewHolder(final View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener!=null){
                    listener.onItemClick(itemView,getPosition());
                }
            }
        });
    }
}

在Activity里面調(diào)用我們的點(diǎn)擊事件

adapter.setOnItemClickListener(new MyRecyclerViewAdapter.onRecyclerViewOnClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        //點(diǎn)擊事件的具體處理代碼
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末供炼,一起剝皮案震驚了整個(gè)濱河市一屋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袋哼,老刑警劉巖冀墨,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涛贯,居然都是意外死亡诽嘉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)弟翘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)虫腋,“玉大人,你說(shuō)我怎么就攤上這事稀余≡眉剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵睛琳,是天一觀的道長(zhǎng)盒蟆。 經(jīng)常有香客問(wèn)我踏烙,道長(zhǎng),這世上最難降的妖魔是什么历等? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任讨惩,我火速辦了婚禮,結(jié)果婚禮上寒屯,老公的妹妹穿的比我還像新娘荐捻。我一直安慰自己,他們只是感情好寡夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布靴患。 她就那樣靜靜地躺著,像睡著了一般要出。 火紅的嫁衣襯著肌膚如雪鸳君。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天患蹂,我揣著相機(jī)與錄音或颊,去河邊找鬼。 笑死传于,一個(gè)胖子當(dāng)著我的面吹牛囱挑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沼溜,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼平挑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了系草?” 一聲冷哼從身側(cè)響起通熄,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎找都,沒(méi)想到半個(gè)月后唇辨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡能耻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年赏枚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓猛。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饿幅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒职,到底是詐尸還是另有隱情栗恩,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布帕涌,位于F島的核電站摄凡,受9級(jí)特大地震影響续徽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亲澡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一钦扭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧床绪,春花似錦客情、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至痹雅,卻和暖如春仰担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绩社。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工摔蓝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愉耙。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓贮尉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親朴沿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猜谚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,846評(píng)論 25 707
  • 一、概述 對(duì)于RecyclerView的學(xué)習(xí)赌渣,主要是需要掌握以下幾點(diǎn): 數(shù)據(jù):Adapter 使用:Recycle...
    澤毛閱讀 7,279評(píng)論 1 23
  • 這篇文章分三個(gè)部分魏铅,簡(jiǎn)單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,379評(píng)論 0 27
  • 沿著碎石小路 在院里閑庭信步 杜鵑花開(kāi)了 格外的嬌艷 錦鯉拍打著水波 歡快的嘻鬧著 這個(gè)時(shí)候 突然出現(xiàn)了一個(gè)卡座 ...
    丶足跡閱讀 138評(píng)論 0 0