React Native學(xué)習(xí)ListView(三):吸頂效果

Demo展示

ios.gif

之前兩篇文章ListView的學(xué)習(xí)都是展示了每一row的數(shù)據(jù)蜈亩,而上面的效果圖中不僅展示了row數(shù)據(jù)懦窘,而且還帶有一個(gè)section header,當(dāng)滑動(dòng)時(shí),這個(gè)section header會(huì)固定在頭部稚配,也就是吸頂效果畅涂。但是遺憾的是,在Android平臺(tái)上不支持吸頂效果,如下圖:

android.gif

Demo知識(shí)點(diǎn)

那如何來(lái)實(shí)現(xiàn)它了道川?我們都知道午衰,在只簡(jiǎn)單地渲染每一行數(shù)據(jù)時(shí)立宜,我們獲取數(shù)據(jù)源時(shí)用ListView對(duì)象的cloneWithRows方法來(lái)獲取的,而想要實(shí)現(xiàn)這種吸頂效果的話臊岸,需要使用 cloneWithRowsAndSections 方法橙数。這個(gè)方法需要傳入三個(gè)參數(shù):

dataBlob        object類型
sectionIDs      array婁型
rowIDs          array類型
  • dataBlob

它是一種數(shù)據(jù)結(jié)構(gòu),包含ListView所需的所有數(shù)據(jù)(section header 和 rows)帅戒,如下圖:

dataBlob.png

<font color=#ff0000 size=5 face="黑體">dataBlob 的 key 值包含 sectionID + rowId</font>,我們可以通過(guò)getSectionData 和 getRowData 來(lái)渲染每一行數(shù)據(jù)灯帮。

  • sectionIDs

sectionIDs 用于標(biāo)識(shí)每組section,如下圖:

sectionIDs.png
  • rowIDs

rowIDs 用于描述每個(gè) section 里的每行數(shù)據(jù)的位置及是否需要渲染逻住。在ListView渲染時(shí)钟哥,會(huì)先遍歷 rowIDs 獲取到對(duì)應(yīng)的 dataBlob 數(shù)據(jù)。

rowIDs.png

Demo實(shí)現(xiàn)

  • 數(shù)據(jù)內(nèi)容

      {
        "data": [
          {
            "cars": [
              {
                "icon": "m_180_100",
                "name": "AC Schnitzer"
              },
              {
                "icon": "m_92_100",
                "name": "阿爾法·羅密歐"
              },
              {
                "icon": "m_9_100",
                "name": "奧迪"
              },
              {
                "icon": "m_97_100",
                "name": "阿斯頓·馬丁"
              }
            ],
            "title": "A"
          },
          ...
        ]
      }
    

這里的'cars'和'title'屬于data數(shù)據(jù)的一組瞎访,也就是我們上面講的一組section數(shù)據(jù)腻贰,而它的sectionId就是0,因?yàn)槭菙?shù)組的第一個(gè)元素扒秸。然后title屬于sectionHeader银受,而cars就是我們的row數(shù)據(jù),而它的rowsId分別為:0~3

  • 主要實(shí)現(xiàn)

    • 初始化ListView的dataSource對(duì)象鸦采,并且設(shè)置獲取sectionHeader和sectionRow數(shù)據(jù)

        constructor(props) {
            super(props);
            var getSectionData = (dataBlob, sectionID) => {
                return dataBlob[sectionID];
            };
      
            var getRowData = (dataBlob, sectionID, rowID) => {
                return dataBlob[sectionID + ':' + rowID];
            };
      
            this.state = {
                dataSource: new ListView.DataSource({
                    getSectionData: getSectionData, // 獲取組中數(shù)據(jù)
                    getRowData: getRowData, // 獲取行中的數(shù)據(jù)
                    rowHasChanged: (r1, r2) => r1 !== r2,
                    sectionHeaderHasChanged: (s1, s2) => s1 !== s2
                })
            };
        }
      
    • 獲取json數(shù)據(jù),并將其放放dataBlob對(duì)象中

        var jsonData = this.props.data;
        var dataBlob = {},
            sectionIDs = [],
            rowIDs = [],
            cars = [];
        for (var i in jsonData) {
            //step 1咕幻、把組數(shù)據(jù)放入sectionIDs數(shù)組中
            sectionIDs.push(i);
            //step 2渔伯、把組中內(nèi)容放dataBlob對(duì)象中
            dataBlob[i] = jsonData[i].title;
            //step 3、取出該組中所有的車
            cars = jsonData[i].cars;
            //step 4記錄每一行中的數(shù)據(jù)
            rowIDs[i] = [];
            //step 5肄程、獲取行中每一組數(shù)據(jù)
            for (var j in cars) {
                //把行號(hào)放入rowIDs中
                rowIDs[i].push(j);
                //把每一行中的內(nèi)容放dataBlob對(duì)象中
                dataBlob[i + ':' + j] = cars[j];
            }
        }
      
    • 刷新狀態(tài)锣吼,將數(shù)據(jù)傳入到listView中

        this.setState({
            dataSource: this.state.dataSource.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs)
        });
      
    • 渲染ListView,設(shè)置相關(guān)屬性

        <ListView
                dataSource={this.state.dataSource}
                renderRow={this.renderRow.bind(this)}
                renderSectionHeader={this.renderSectionHeader.bind(this)}
         />
      

好了蓝厌。ListView吸頂效果的學(xué)習(xí)就完成了玄叠。完整代碼

參考資料

http://moduscreate.com/react-native-listview-with-section-headers/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拓提,隨后出現(xiàn)的幾起案子读恃,更是在濱河造成了極大的恐慌,老刑警劉巖代态,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺惫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蹦疑,警方通過(guò)查閱死者的電腦和手機(jī)西雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)歉摧,“玉大人艇肴,你說(shuō)我怎么就攤上這事腔呜。” “怎么了再悼?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵核畴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我帮哈,道長(zhǎng)膛檀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任娘侍,我火速辦了婚禮咖刃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憾筏。我一直安慰自己嚎杨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布氧腰。 她就那樣靜靜地躺著枫浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古拴。 梳的紋絲不亂的頭發(fā)上箩帚,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音黄痪,去河邊找鬼紧帕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桅打,可吹牛的內(nèi)容都是我干的是嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼挺尾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹅搪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起遭铺,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丽柿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后魂挂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航厚,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年锰蓬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔睬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芹扭,死狀恐怖麻顶,靈堂內(nèi)的尸體忽然破棺而出赦抖,到底是詐尸還是另有隱情,我是刑警寧澤辅肾,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布队萤,位于F島的核電站,受9級(jí)特大地震影響矫钓,放射性物質(zhì)發(fā)生泄漏要尔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一新娜、第九天 我趴在偏房一處隱蔽的房頂上張望赵辕。 院中可真熱鬧,春花似錦概龄、人聲如沸还惠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚕键。三九已至,卻和暖如春衰粹,著一層夾襖步出監(jiān)牢的瞬間锣光,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工铝耻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉晶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓田篇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箍铭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泊柬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開發(fā)基礎(chǔ),沒(méi)有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 13,339評(píng)論 11 24
  • 一. 簡(jiǎn)介 一個(gè)核心組件诈火,用于高效地顯示一個(gè)可以垂直滾動(dòng)的變化的數(shù)據(jù)列表兽赁。最基本的使用方式就是創(chuàng)建一個(gè)ListVi...
    飛奔的小馬閱讀 1,238評(píng)論 0 2
  • 對(duì)于官方給的DataSource使用說(shuō)法可能對(duì)于單一的一組使用很容易處理,但是使用到分組就會(huì)讓人特別頭疼冷守,這些奇怪...
    半日浮生_iOSer閱讀 5,790評(píng)論 5 7
  • 2017年6月24日 圣潔 (譽(yù)白牡丹) 皎皎靈瓏冰雪懷刀崖, 叢中圣潔數(shù)枝開。 仙風(fēng)道骨何方客拍摇, 素韻清香檻外來(lái)亮钦。
    曼殊兆蘭閱讀 693評(píng)論 27 29
  • 黑黑的像一塊塊橡皮擦似的臭豆腐帶著讓人欲罷不能又想退避三舍的味道呆在阿姨的漏勺里被輕輕的放入高溫的油鍋,大朋友...
    樂(lè)四月閱讀 407評(píng)論 2 2