RN FlatList的item高度不定時(shí),如何精準(zhǔn)定位

案例:

界面上部分橫向滾動(dòng)(Scrollview)的標(biāo)題卫枝,下部分是內(nèi)容列表(FlatList)泻肯,但是由于 flatlist 的item 高度不定渊迁,無法準(zhǔn)確使用getItemLayout計(jì)算高度,導(dǎo)致無法使用scrollToIndex以及scrollToItem定位方法灶挟,而我的需求是:點(diǎn)擊上部分的某個(gè)標(biāo)題能準(zhǔn)確跳轉(zhuǎn)到某一個(gè) item琉朽。

scrollToIndex()

scrollToIndex(params);

將位于指定位置的元素滾動(dòng)到可視區(qū)的指定位置,當(dāng)viewPosition 為 0 時(shí)將它滾動(dòng)到屏幕頂部稚铣,為 1 時(shí)將它滾動(dòng)到屏幕底部箱叁,為 0.5 時(shí)將它滾動(dòng)到屏幕中央墅垮。

注意:如果不設(shè)置getItemLayout屬性的話,無法跳轉(zhuǎn)到當(dāng)前渲染區(qū)域以外的位置耕漱。


scrollToItem()

scrollToItem(params);

這個(gè)方法會(huì)順序遍歷元素算色。盡可能使用scrollToIndex代替。

注意:如果不設(shè)置getItemLayout屬性的話螟够,無法跳轉(zhuǎn)到當(dāng)前渲染區(qū)域以外的位置灾梦。

scrollToOffset()

scrollToOffset(params);

滾動(dòng)列表到指定的偏移(以像素為單位),等同于ScrollViewscrollTo方法妓笙。

案例UI

我的item 是 下面三種樣式若河,肯定有童鞋想說為什么不用numColumns ={2}的屬性設(shè)置,如果使用了這個(gè)寞宫,我無法控制一部分item上面的標(biāo)題UI萧福,當(dāng)然,如果你可以辈赋,歡迎留言教教我
item的樣式1

item的樣式2

item的樣式3

好了鲫忍,上面說了這么多,就是想引出钥屈,下面如何動(dòng)態(tài)計(jì)算高度悟民,以及精準(zhǔn)定位。


    <FlatList
        ref={view => {
          this.flatlist = view;
        }}
        initialNumToRender={3}
        data={dataArray}
        keyExtractor={(item, index) => index.toString()}
        renderItem={this.renderItem}
        ListHeaderComponent={this.renderHeader}
        onScroll={this.listScroll}
      />
    <ScrollView
            showsHorizontalScrollIndicator={false}
            showsVerticalScrollIndicator={false}
            horizontal={true}
            style={[styles.nav_scroll_top, styles.topTabs]}
            scrollEventThrottle={20}
            onScroll={this.navScroll}
            ref={ref => {
              this.myNavScrollTop = ref;
            }}>
            <View style={styles.nav_top}>
              {title.map((item, index) => {
                return (
                  <TouchableOpacity
                    key={index}
                    style={styles.nav_view}
                    onPress={() => this.navSelect(index)}
                    activeOpacity={1}>
                    <Text
                      style={[
                        styles.nav_title,
                        navIndex == index ? styles.nav_title_select : null,
                      ]}>
                      {item}
                    </Text>
                    {navIndex == index ? (
                      <Text style={styles.nav} />
                    ) : null}
                  </TouchableOpacity>
                );
              })}
            </View>
          </ScrollView>

使用onLayout方法篷就,計(jì)算每個(gè)item 的高度逾雄,存儲(chǔ)起來

renderItem = rowData => {
    const {item, index} = rowData;
    const {
      hasMainTitle,
      field_title,
      rule_title,
      rule_desc,
      leftItem,
      rightItem,
    } = item;
    // console.log('rowItem-===', item);
    return (
      <View
        onLayout={event => {
          // console.log('renderItem===', event.nativeEvent.layout.height);
          <!--重點(diǎn)在這里,計(jì)算每個(gè)item的高度-->
          layoutText.push({
            height: event.nativeEvent.layout.height,
            index: index,
          });
        }}>
        {hasMainTitle && (
          <View style={[styles.discount_subclass_text_wrap]}>
            <!--主標(biāo)題內(nèi)容腻脏,例如 111-->
          </View>
        )}

        {hasMainTitle && rule_title != '' ? (
          <View style={[styles.ruleTitleWrap]}>
            <!--副標(biāo)題-->
          </View>
        ) : null}
        {hasMainTitle && rule_desc != '' ? (
          <View style={[styles.ruleDescWrap]}>
            <!--副標(biāo)題的描述-->
          </View>
        ) : null}
        <View
          style={{
            flex: 1,
            paddingHorizontal: px2dp(50),
            flexDirection: 'row',
            justifyContent: 'space-between',
          }}>
          <!--左邊的整體布局-->
          <!--右邊的整體布局-->
        </View>
      </View>
    );
  };

點(diǎn)擊上部分的title,使用scrollToOffset方法跳轉(zhuǎn)定位到某個(gè)位置,由于每個(gè)title下的item數(shù)量不定银锻,所以我之前存儲(chǔ)過每個(gè)item 的行數(shù) this.nums=[{index: 0,num: 12},...]永品,表示第1個(gè)title下,有12行數(shù)據(jù)

navSelect(index) {
    let layoutHeight = 0;
    let allLines = 0;
    this.nums.map((item, mapIndex) => {
      if (index > mapIndex) {
        allLines += item.num;
      }
    });
    layoutText.forEach((item, layoutIndex) => {
      if (allLines > layoutIndex) {
        layoutHeight += layoutText[layoutIndex].height;
      }
    });
    if (index == 0) {
      layoutHeight = 0;
    } else {
      layoutHeight = layoutHeight + px2dp(220);
    }

    console.log('layoutHeight==', layoutHeight);

    this.flatlist.scrollToOffset({offset: layoutHeight, animated: true});
}

到了這里击纬,我這邊就可以通過點(diǎn)擊頂部title精準(zhǔn)定位了6恪!更振!至此結(jié)束炕桨,歡迎各位童鞋多多指教,謝謝

本文部分內(nèi)容摘自https://reactnative.cn/docs/flatlist/#scrolltoindex
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肯腕,一起剝皮案震驚了整個(gè)濱河市献宫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌实撒,老刑警劉巖姊途,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涉瘾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捷兰,警方通過查閱死者的電腦和手機(jī)立叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贡茅,“玉大人秘蛇,你說我怎么就攤上這事《タ迹” “怎么了赁还?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)村怪。 經(jīng)常有香客問我秽浇,道長(zhǎng),這世上最難降的妖魔是什么甚负? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任柬焕,我火速辦了婚禮,結(jié)果婚禮上梭域,老公的妹妹穿的比我還像新娘斑举。我一直安慰自己,他們只是感情好病涨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布富玷。 她就那樣靜靜地躺著,像睡著了一般既穆。 火紅的嫁衣襯著肌膚如雪赎懦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天幻工,我揣著相機(jī)與錄音励两,去河邊找鬼。 笑死囊颅,一個(gè)胖子當(dāng)著我的面吹牛当悔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踢代,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盲憎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了胳挎?” 一聲冷哼從身側(cè)響起饼疙,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慕爬,沒想到半個(gè)月后宏多,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儿惫,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年伸但,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肾请。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡更胖,死狀恐怖铛铁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情却妨,我是刑警寧澤饵逐,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站彪标,受9級(jí)特大地震影響倍权,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捞烟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一薄声、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧题画,春花似錦默辨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竞思,卻和暖如春表谊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盖喷。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工铃肯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人传蹈。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像步藕,于是被迫代替她去往敵國(guó)和親惦界。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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