創(chuàng)建Material Design風(fēng)格的Android應(yīng)用--創(chuàng)建列表和卡片

本人所有文章首先發(fā)布于個(gè)人博客须喂,歡迎關(guān)注,地址:http://blog.isming.me

上次說(shuō)過(guò)使用主題,應(yīng)用Material Design的樣式到旦,同時(shí)卡片布局也是Material Design的重要組成部分柬祠,今天來(lái)寫(xiě)寫(xiě)淤毛。

引言

在程序中創(chuàng)建復(fù)雜的Material Design 樣式的 List和Card,可以使用RecyclerView和CardView組件,這兩個(gè)組件是在最新的support v7包(version 21)中提供的。因此需要引入依賴(lài)包:

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.android.support:cardview-v7:+'
    compile 'com.android.support:recyclerview-v7:+'
}

創(chuàng)建List

RecylerView組件是一個(gè)更加高效靈活的ListView消别。這個(gè)組件時(shí)一個(gè)顯示大數(shù)據(jù)集的容器抛蚤,可以有效的滾動(dòng),保持顯示一定數(shù)量的視圖寻狂。使用RecyclerView組件霉颠,當(dāng)你有數(shù)據(jù)集,并且數(shù)據(jù)集的元素在運(yùn)行時(shí)根據(jù)用戶(hù)的操作或者網(wǎng)絡(luò)事件改變荆虱。

RecylerView類(lèi)簡(jiǎn)化大數(shù)據(jù)集的顯示和處理蒿偎,通過(guò)提供:
布局管理者控制元素定位朽们。
在通用的元素上操作上顯示默認(rèn)的動(dòng)畫(huà),比如移除和增加元素诉位。

使用RecyclerView組件骑脱,你需要指定一個(gè)Adapter和布局管理器,創(chuàng)建一個(gè)Adapter繼承RecyclerView.Adapter類(lèi)苍糠,具體的實(shí)現(xiàn)細(xì)節(jié)要根據(jù)數(shù)據(jù)集合視圖的類(lèi)型變化叁丧,具體信息,看下面的例子岳瞭。

一個(gè)布局管理器定位Item視圖在RecyclerView中拥娄,決定什么時(shí)候去回收它當(dāng)他不再可見(jiàn)時(shí)。當(dāng)重用(或者回收)一個(gè)視圖時(shí)瞳筏,布局管理器可能會(huì)請(qǐng)求適配器(Adapter)去替換子視圖中的內(nèi)容用不同的內(nèi)容稚瘾。通過(guò)這種方式回收重用視圖,可以減少view的創(chuàng)建和避免更多的findViewById()姚炕,從而提高性能摊欠。

RecyclerView提供了以下內(nèi)建的布局管理器:

LinearLayoutManager 顯示Item 在一個(gè)水平或者垂直的滾動(dòng)列表中。
GridLayoutManager 顯示Item 作為網(wǎng)格布局柱宦。
StaggeredGridLayoutManager 顯示Item在交錯(cuò)的網(wǎng)格布局些椒。

也可以自己通過(guò)繼承RecyclerView.LayoutManager類(lèi)創(chuàng)建自定義的布局管理器。

RecylerView組件
RecylerView組件

RecylerView組件

動(dòng)畫(huà):

RecyclerView默認(rèn)情況下就有動(dòng)畫(huà)掸刊,在刪除或者增加Ite的時(shí)候免糕。如果需要自定義動(dòng)畫(huà),繼承RecyclerView.ItemAnimator類(lèi)忧侧,并且使用RecyclerView.setItemAnimator()方法將定義的動(dòng)畫(huà)設(shè)置到我們的視圖中说墨。

下面開(kāi)始看例子:
1.首先在xml布局文件增加一個(gè)RecyclerView

<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

2.然后在我們的Java代碼中使用,附加Adapter和數(shù)據(jù)就可以顯示了苍柏。

public class MyActivity extends Activity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        // specify an adapter (see also next example)
        mAdapter = new MyAdapter(myDataset);
        mRecyclerView.setAdapter(mAdapter);
    }
    ...
}

3.Adapter提供訪問(wèn)數(shù)據(jù)集中的Item尼斧,創(chuàng)建視圖映射到數(shù)據(jù)上,并且替換布局的內(nèi)容數(shù)據(jù)用新的item试吁。下面的代碼顯示一個(gè)簡(jiǎn)單的實(shí)現(xiàn)棺棵,使用TextView顯示簡(jiǎn)單的String數(shù)組。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private String[] mDataset;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                               .inflate(R.layout.my_text_view, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ...
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.mTextView.setText(mDataset[position]);

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

創(chuàng)建Card

CardView繼承FrameLayout類(lèi)熄捍,通過(guò)它可以顯示信息在卡片內(nèi)部烛恤,并且在不同的平臺(tái)上有統(tǒng)一的樣式。CardView組件可以有陰影和圓角余耽。

創(chuàng)建有陰影的Card,使用card_view:cardElevation屬性缚柏。CardView 使用真實(shí)的高度和動(dòng)態(tài)陰影在Android5.0(API 21)和更高版本,較早的版本則使用傳統(tǒng)的陰影碟贾。

使用這些屬性去定制CardView的外觀:

使用card_view:cardCornerRadius屬性設(shè)置圓角的半徑币喧,在布局文件中轨域。
使用CardView.setRadius方法設(shè)置圓角的半徑在java代碼中。
設(shè)置卡片的背景顏色杀餐,使用card_view:cardBackgroundColor屬性干发。

下面是一個(gè)在xml布局文件中包含一個(gè)CardView的示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    ... >
    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="200dp"
        android:layout_height="200dp"
        card_view:cardCornerRadius="4dp">

        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </android.support.v7.widget.CardView>
</LinearLayout>
Card示例圖
Card示例圖

Card示例圖

亂彈

通過(guò)上面可以看到RecyclerView。跟我們經(jīng)常使用的ListView很像史翘,不過(guò)它的父類(lèi)并不是AbsListView,因此不能混著使用枉长。但是在很多地方可以替換ListView,通過(guò)ViewHolder,View重用,可以看到這是一個(gè)更加高效的視圖組件琼讽,推薦使用必峰。

CardView,本質(zhì)上就是一個(gè)比較符合Material Design的組件,使用Card布局钻蹬,效果更好吼蚁。很多人之前可能也使用一些CardUi,谷歌官方出了這個(gè),強(qiáng)烈推薦使用脉让。

上面RecyclerView和CardView,是分開(kāi)寫(xiě)的桂敛,但是我們可以用在一起的哦功炮,不要糊涂了呀溅潜。

參考資料:http://developer.android.com/training/material/lists-cards.html

原文地址:http://blog.isming.me/2014/10/21/creating-app-with-material-design-two-list/,轉(zhuǎn)載請(qǐng)注明出處薪伏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滚澜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫁怀,更是在濱河造成了極大的恐慌设捐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塘淑,死亡現(xiàn)場(chǎng)離奇詭異萝招,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)存捺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)槐沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捌治,你說(shuō)我怎么就攤上這事岗钩。” “怎么了肖油?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵兼吓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我森枪,道長(zhǎng)视搏,這世上最難降的妖魔是什么审孽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮凶朗,結(jié)果婚禮上瓷胧,老公的妹妹穿的比我還像新娘。我一直安慰自己棚愤,他們只是感情好搓萧,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宛畦,像睡著了一般瘸洛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上次和,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天反肋,我揣著相機(jī)與錄音,去河邊找鬼踏施。 笑死石蔗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畅形。 我是一名探鬼主播养距,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼日熬!你這毒婦竟也來(lái)了棍厌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竖席,失蹤者是張志新(化名)和其女友劉穎耘纱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毕荐,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡束析,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憎亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片员寇。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虽填,靈堂內(nèi)的尸體忽然破棺而出丁恭,到底是詐尸還是另有隱情,我是刑警寧澤斋日,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布牲览,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏第献。R本人自食惡果不足惜贡必,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庸毫。 院中可真熱鬧仔拟,春花似錦、人聲如沸飒赃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)载佳。三九已至炒事,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔫慧,已是汗流浹背挠乳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姑躲,地道東北人睡扬。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黍析,于是被迫代替她去往敵國(guó)和親卖怜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,321評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,791評(píng)論 22 665
  • 有紋身的女孩牍戚,就一定是壞女孩侮繁? 首先你怎樣定義一個(gè)好人與壞人,看外表嗎如孝?曾有人說(shuō)過(guò)一句話(huà):“未經(jīng)審視的生命不值得活...
    酒濃情傷閱讀 696評(píng)論 0 1
  • 晚霞宪哩。 時(shí)間和執(zhí)念到底哪個(gè)更堅(jiān)不可摧。
    蓬蓬蓬的毛毛熊閱讀 98評(píng)論 0 0
  • 煙火紅塵第晰,渡口人生锁孟,迎來(lái)送往,這個(gè)世界每天有人哭著到來(lái)茁瘦,也有人笑著離去品抽。明陽(yáng)山,一個(gè)曾讓我哭嘶喉嚨的地方甜熔,當(dāng)再次踏...
    那些年聆聽(tīng)的閱讀 218評(píng)論 0 0