如何在 React Native ListView 中将项目居中?

2024-04-23

我试图在选择一个项目时将其置于水平列表视图的中心。我当前的策略是首先测量项目并滚动到视图中引用项目的 x 坐标。

目前,每当我按下某个项目时ListView滚动到最后x: 538

有没有更简单的方法来实现这一点,同时保持代码无状态/功能?

const ItemScroll = (props) => {

  const createItem = (obj, rowID) => {

    const isCurrentlySelected = obj.id === props.currentSelectedID

    function scrollToItem(_scrollViewItem, _scrollView) {
      // measures the item coordinates
      _scrollViewItem.measure((fx) => {
        console.log('measured fx: ', fx)
        const itemFX = fx;
        // scrolls to coordinates
        return _scrollView.scrollTo({ x: itemFX });
      });
    }
    return (
      <TouchableHighlight
        ref={(scrollViewItem) => { _scrollViewItem = scrollViewItem; }}
        isCurrentlySelected={isCurrentlySelected}
        style={isCurrentlySelected ? styles.selectedItemContainerStyle : styles.itemContainerStyle}
        key={rowID}
        onPress={() => { scrollToItem( _scrollViewItem, _scrollView); props.onEventFilterPress(obj.id, rowID) }}>
        <Text style={isCurrentlySelected ? styles.selectedItemStyle : styles.itemStyle} >
          {obj.title}
        </Text>
      </TouchableHighlight>
    )
  };
  return (
    <View>
      <ScrollView
        ref={(scrollView) => { _scrollView = scrollView; }}
        horizontal>
        {props.itemList.map(createItem)}
        {props.onItemPress}
      </ScrollView>
    </View>
  );
};

Update

根据@Ludovic的建议,我现在已经切换到FlatList,我不确定如何使用功能组件触发scrollToIndex。下面是我的新 ItemScroll

const ItemScroll = (props) => {

  const {
      itemList,
      currentSelectedItem
      onItemPress } = props

  const renderItem = ({item, data}) => {
    const isCurrentlySelected = item.id === currentSelectedItem

    const _scrollToIndex = () => { return { viewPosition: 0.5, index: data.indexOf({item}) } }

    return (
      <TouchableHighlight
        // Below is where i need to run onItemPress in the parent
        // and scrollToIndex in this child.
        onPress={[() => onItemFilterPress(item.id), scrollToIndex(_scrollToIndex)]} >
        <Text style={isCurrentlySelected ? { color: 'red' } : { color: 'blue' }} >
          {item.title}
        </Text>
      </TouchableHighlight>
    )
  }
  return (
    <FlatList
      showsHorizontalScrollIndicator={false}
      data={itemList}
      keyExtractor={(item) => item.id}
      getItemLayout={(data, index) => (
          // Max 5 items visibles at once
          { length: Dimensions.get('window').width / 5, offset: Dimensions.get('window').width / 5 * index, index }
      )}
      horizontal        
      // Here is the magic : snap to the center of an item
      snapToAlignment={'center'} 
      // Defines here the interval between to item (basically the width of an item with margins)
      snapToInterval={Dimensions.get('window').width / 5}
      renderItem={({item, data}) => renderItem({item, data})} />
  );
};

在我看来,你应该使用FlatList

FlatList 有一个方法scrollToIndex允许直接转到您的数据项。它与 ScrollView 几乎相同,但更智能。遗憾的是,文档非常差。

这是我做的 FlatList 的一个例子

let datas = [{key: 0, text: "Hello"}, key: 1, text: "World"}]

<FlatList
    // Do something when animation ended
    onMomentumScrollEnd={(e) => this.onScrollEnd(e)} 
    ref="flatlist"
    showsHorizontalScrollIndicator={false}
    data={this.state.datas}
    keyExtractor={(item) => item.key}
    getItemLayout={(data, index) => (
        // Max 5 items visibles at once
        {length: Dimensions.get('window').width / 5, offset: Dimensions.get('window').width / 5 * index, index}   
    )}
    horizontal={true}
    // Here is the magic : snap to the center of an item
    snapToAlignment={'center'}  
    // Defines here the interval between to item (basically the width of an item with margins)
    snapToInterval={Dimensions.get('window').width / 5}    
    style={styles.scroll}
    renderItem={ ({item}) =>
        <TouchableOpacity
            onPress={() => this.scrollToIndex(/* scroll to that item */)}
            style={styles.cell}>
            <Text>{item.text}</Text>
        </TouchableOpacity>
    }
/>

有关 FlatList 的更多信息:https://facebook.github.io/react-native/docs/flatlist#__docusaurus https://facebook.github.io/react-native/docs/flatlist#__docusaurus

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React Native ListView 中将项目居中? 的相关文章

  • require未定义nodejs

    尝试使用此 smartsheet api http smartsheet platform github io api docs javascript node js sample code http smartsheet platform
  • nodeJS require.paths 解决问题

    我试图相对且神秘地需要一个文件 以下情况正在发生 这很有效 这表明 Users marcos Desktop Taper lib utils js myPath Users marcos Desktop Taper lib utils re
  • 带有路径连接器的 jQuery 可拖动小部件

    参考该图像 Block1 和Block2 都是可拖动的 我的问题是 如何在两个块之间制作红色链状连接器 要求是链条应该延伸到块被拖动的地方 请提供任何教程 学习材料的指示 谢谢 有许多 Jquery 插件可用于创建数据库可视化或流程图的连接
  • 是否可以实现异步跨域文件上传?

    有可能的 参见下文 首先我用这张图来解释一下异步文件上传可以实现 对不起 我已经关闭了我的一个域 该图像现在消失了 不过 这确实是一个很好的图像 这是在我发现 Stack Overflow 可以通过 Imgur 上传图像之前 正如您所看到的
  • 如何编写三元运算符(又名 if)表达式而不重复自己

    例如 这样的事情 var value someArray indexOf 3 1 someArray indexOf 3 0 有更好的写法吗 再说一遍 我并不是在寻求上述问题的答案 只是一个在三元运算符表达式中可能重复操作数的示例 就我个人
  • Google Analytics 是否具有针对长时间运行的网络应用程序的“心跳”功能?

    我正在制作一个专注于观看嵌入内容的网络应用程序 我希望应用程序客户端向 GA Google Analytics 发送 心跳 类型的信号以保持会话继续进行 现在看来 如果访问者观看视频 5 10 分钟 GA 就会假设他已经离开页面 并将用户的
  • AngularJS:如何在 AngularJS 中使用或注入第三方库

    我是 Angular 和 Deployd 的新手 想知道如何一起使用它们 我发现 Deployd 网站中的示例很好 但它只消耗其余 API 数据 我想了解如何将 Deployd 作为 AngularJS 中的服务 例如 通过部署中可用的收集
  • CasperJS - 在网站上注册并验证 Gmail 上发送的邮件 - 对于 slimer 和 phantom -

    Edit 这是windows的行为 linux就失败了 首先 如果您使用 casper 成功导航 gmail 没有随机等待时间 从 20 秒到 5 分钟 请告诉我 我想在我们的网站上注册 然后使用 Gmail 自动验证我的注册 整个注册步骤
  • Xamarin Forms ListView onpressing 事件

    当按下项目时 我想通过绑定 以编程方式 更改 IconToShow 属性来更改图像 如何触发 OnPressed 事件
  • canvas:如何在一个变换语句中完成平移、倾斜、旋转...?

    最近几天我在学习 变换 现在我知道如何通过变换的矩阵进行平移 旋转 倾斜 缩放 但如果我想在一个转换语句中执行上述所有操作 我该怎么办 ctx transform a b c d e f 当我们想要通过变换旋转某些东西时 我们必须为每个参数
  • 为什么 Firefox 对“select”标签上的“click”事件的反应与 Webkit 和 IE 不同?

    我意识到 Firefox 对待click事件于
  • 在 Codeigniter 中使用/嵌入 Ember js

    我即将开始开发一个 Web 应用程序 使用 Ember js 作为前端技术 使用 Codeigniter 作为后端 我遇到的问题是如何在 codeigniter 中嵌入或使用 ember js 可以通过 Web 服务从 codeignite
  • 避免使用 Grunt cssmin 任务来删除重复条目

    在我的 Gruntfile 中 我使用 cssmin grunt contrib cssmin 任务 就像是 cssmin css src dist styles css dest dist styles min css 问题是 style
  • react-native run-android 失败,无法安装应用程序

    当我尝试在 Android 设备中运行反应本机应用程序时 我遇到了问题 即使我确定设备已连接 设备仍已连接 亚行设备 附加设备列表 HMNBBCE6A2826109 器件 设备 华为Y2 安卓版本 5 1 调试模式 启用 服务器正在运行 当
  • 同步 jQuery 动画

    我正在尝试同时获得淡入 不透明度切换 和边框淡入 使用jquery 动画颜色 http www bitstorm org jquery color animation 同时开火 但我遇到了一些麻烦 有人可以帮忙查看以下代码吗 fn exte
  • JSON 和 AJAX 与 jQuery 有什么区别?

    我听说 JSON 会序列化所有数据 这可以防止我在跨浏览器支持等方面遇到客户端问题 我一直在使用 AJAX 和 jQuery 这看起来很简单 但我不确定其中的区别 我读过我也可以使用它来获取数据 ajax url url dataType
  • 无法定义 set 和 get 方法

    尝试使用访问器定义属性时出现错误 这是我的代码 var person Object defineProperty person birthYear value 1997 writable true enumerable true confi
  • 将 csv 解析输出保存到变量

    我是使用 csv parse 的新手 项目 github 中的这个示例满足了我的需要 但有一个例外 我不想通过 console log 输出 而是想将数据存储在变量中 我尝试将 fs 行分配给变量然后返回data而不是记录它 但这只是返回了
  • MutationObserver 不适合儿童

    提前为可能是一个简单的问题和下面令人震惊的 javascript 道歉 我的问题如下 网站上有一个横幅 每隔几秒钟就会显示四个图像 我正在尝试将 印象 推入数据层以供 GTM 拾取 为了显示下一个图像 我们 不是我自己 将下一个横幅图像的
  • 关闭网站的 IE 8 兼容模式

    我的公司使用IE8作为默认浏览器 并且默认为所有内联网站点设置兼容模式 我正在构建一个在关闭兼容模式时可以工作的 Intranet 站点 我正在使用 Reset css 和几个开源 JavaScript 程序 例如数据表 我想做的是强制关闭

随机推荐

  • 优雅的模式来记录用户的操作

    我有一个数据库架构来记录用户在我的网络应用程序中执行的操作 Log Id Log Type Id Performed by Person Id Performed to Person Id Comment Id Story Id Photo
  • SQL Server:索引重建和索引重组有什么区别?

    指数重建和指数重组有什么区别 思考一下索引是如何实现的 它通常是某种树 例如 B 树或 B 树 索引本身是通过查看数据中的键并构建树来创建的 以便可以有效地搜索表 当你改组索引 您遍历现有索引 清理已删除记录的块等 这could当您进行删除
  • 如何在 Android 上直接从麦克风向扬声器播放声音?

    在我的应用程序中 我需要将声音从麦克风直接引导到扬声器 没有其他动作 我找到了一种通过播放文件并关闭扬声器将声音从麦克风引导到耳机的方法 所以我想扬声器可以类似地工作 但是我不知道如何摆脱播放文件的事情 谢谢 speaker m audio
  • unix系统上C++中的简单glob?

    我想检索遵循此模式的所有匹配路径vector
  • 如何防止gitlab ci每次都下载sbt?

    我们有一个play2 scala我们正在使用 gitlab ci 构建的应用程序 Our gitlab ci yml 至少重要部分 如下所示 image hseeberger scala sbt variables SBT GLOBAL B
  • 导入“google/api/annotations.proto”未找到或有错误。如何将其添加为依赖项?

    按照文档如何设置 gRPC 网关 https github com grpc ecosystem grpc gateway 我发现自己陷入了生成 grpc 网关的第四步 也就是说 当添加以下行时 事情就会崩溃 import google a
  • 如何让 Mechanize 自动将正文转换为 UTF8?

    我找到了一些解决方案post connect hook and pre connect hook 但似乎它们不起作用 我正在使用最新的 Mechanize 版本 2 1 没有 response 新版本中的字段 我不知道在新版本中从哪里获取它
  • 如何创建页面链接并在该页面的 iframe 中加载特定内容

    在我们的网站上 我们有一个页面可以将内容从另一个位置提取到 iFrame 中 我想知道如何创建指向父页面的链接并在 iFrame 中加载特定页面 所以 我想创建一个链接http xxx xxx com page http xxx xxx c
  • 如何在客户端 JavaScript 中读取本地 csv 文件?

    我有客户端 javascript 我想从本地读取它csv文件 在html代码中 我使用脚本标签导入本地javascript文件 并且该js文件位于另一个文件夹中 js文件的内容 ajax type GET url data English
  • 简单聚类算法 2D。检测点簇

    任何人都知道用 C 实现的简单算法来检测 2D 游戏中的怪物组 前任 char周围100范围内有怪物 我想检测哪些怪物在彼此范围 2 内 如果至少有 5 个在一起 则在该位置使用效果区域技能 否则使用单目标技能 最好有一个实现的链接 最好是
  • 在 matplotlib 中,有没有办法在条形/线条/补丁下方设置网格线,同时保留上面的刻度标签?

    相关Matplotlib 在其他图形元素后面绘制网格线 https stackoverflow com questions 1726391 matplotlib draw grid lines behind other graph elem
  • 读外国文字

    我有一个包含英超足球运动员姓名的数据库 我正在将其读入 R 3 02 但当涉及到姓名中含有外来字符 元音变音 重音符号等 的球员时 我遇到了困难 下面的代码说明了这一点 PlayerData lt read table C Users Do
  • 将 vec3b 转换为 mat

    我有彩色图像im 我想使用以下代码使用 vec3b 获取 3 通道图像的像素值 for int i 0 i lt im rows i for int j 0 j lt im cols j for int k 0 k lt nChannels
  • 在 Java 中显式调用默认方法

    Java 8 引入默认方法 http cr openjdk java net dlsmith jsr335 jsr335 0 6 2 H html提供扩展接口的能力 而无需修改现有的实现 我想知道当该方法已被覆盖或由于不同接口中的默认实现冲
  • 自动调整winform和控件到屏幕尺寸

    我创建了一个 winform 应用程序 每个屏幕的尺寸为1361 768像素 这对于较大的屏幕和 或笔记本电脑非常有用 但现在我必须将我的应用程序移至 10 英寸屏幕平板电脑 这意味着我的应用程序不适合 我以前从未处理过这个问题 如何在较小
  • R包安装时间长 - 源代码或二进制类型

    我正在尝试安装一个名为stringi使用下面的命令 install packages stringi 虽然它没有抛出任何错误消息 但安装尚未结束 我在控制台屏幕上看到很多消息 该屏幕持续运行超过 45 分钟 gt install packa
  • JavaScript 中何处使用 ArrayBuffer 与类型化数组?

    我正在从 Node js 迁移到浏览器环境 但我仍然对 ArrayBuffer 与类型化数组 例如 Uint8Array 感到困惑 我对在哪里使用类型化数组以及在哪里直接使用 ArrayBuffer 感到困惑 将一种转换为另一种并不难 反之
  • 无法保存从网络摄像头捕获的图像(OpenCV 2.3 的 imwrite 编译错误)

    我正在使用 OpenCV 2 3 制作简单的网络摄像头程序 但遇到了编译错误 任何想法将不胜感激 编译后 我在 imwrite 处收到以下错误 在下面代码的 read 函数中 这个样本 https code ros org svn open
  • 使用 JavaScript 读取元素的 CSS 属性

    因此 如果有一个 css 文件链接到如下网页 我想读取某个属性 例如 div 有 className layout 并且我想使用 JavaScript 读取此属性的详细信息 我该怎么做 我已经搜索了很多 但几乎没有运气 请建议 您有两个选择
  • 如何在 React Native ListView 中将项目居中?

    我试图在选择一个项目时将其置于水平列表视图的中心 我当前的策略是首先测量项目并滚动到视图中引用项目的 x 坐标 目前 每当我按下某个项目时ListView滚动到最后x 538 有没有更简单的方法来实现这一点 同时保持代码无状态 功能 con