每次我的平面列表数据更改时,如何显示活动指示器?

Posted

技术标签:

【中文标题】每次我的平面列表数据更改时,如何显示活动指示器?【英文标题】:How do I show an activity indicator every time my flatlist data changes? 【发布时间】:2022-01-05 11:58:15 【问题描述】:

我正在使用名为 selectedStream 的状态设置我的平面列表组件显示的数据。每次用户按下不同的组选项时,selectedStream 都会发生变化。我注意到平面列表需要 1-3 秒来刷新它当前已经显示的所有帖子。我希望有一个加载指示器,以便在指示器消失时,列表已经正确显示新更新的数据。

        <FlatList   
                    maxToRenderPerBatch=5
                    bounces=false
                    windowSize=5
                    ref=feedRef   
                    data=selectedStream/> 

【问题讨论】:

【参考方案1】:

每当我们处理与 UI 相关的任何事情时,有时我们可能会遇到 UI 重新渲染的延迟。但是,我们需要先弄清楚究竟是什么导致了延迟。

关于您的代码的正确问题是:

项目的渲染时间是否比预期的要长?或者,是否因为依赖于 API 调用或任何其他异步任务而延迟传递数据?

一旦你回答了这个问题,你可能会遇到两种情况:

1. FlatList 渲染视图的时间更长

这通常不会发生,因为 RN FlatList 只会呈现用户在任何给定时间可见的视图,并且会在用户滚动列表时继续呈现新视图。但是,可能存在一些闪烁的问题,您可以参考以下文章:

8 Ways to optimise your RN FlatList

2。传递数据会导致延迟

这是最常见的场景,我们可能会调用 API 端点并获取一些数据,然后执行 setState 以相应地更新任何视图/列表。一种通用的方法是显示某种进度条,表明应用程序很忙,从而保持适当的用户体验。最简单的方法是条件渲染

一般的例子是:

const [myList, setMyList] = useState();

function callAPIforMyList()
// logic goes here


return 
  myList ? <ActivityIndicator .../> : <Flatlist .... />


上面的代码将检查myListundefined 还是有一个值。如果undefined,它将呈现ActivityIndicator,否则将呈现FlatList

另一种情况可能是myList 可能有现有数据,但您需要用新数据更新/替换它。这样上面的检查可能会失败,所以我们可以再做一次检查:

const [myList, setMyList] = useState();
const [isAPIbusy, setAPIBusy] = useState(false)

function callAPIformyList() 
  setAPIBusy(true)
  /// other logics or async calls or redux-dispatch
  
  setAPIBusy(false)


return 
  !isAPIBusy && myList ? (<Flatlist .... />) : (<ActivityIndicator .../>)

 

您可以使用更多turneries添加多个条件,例如isAPIBusy ? &lt;View1&gt; : otherBoolean ? &lt;View2&gt; : &lt;Default_View_When_No_Conditions_Match)/&gt;

希望这有助于澄清您的需求。

【讨论】:

以上是关于每次我的平面列表数据更改时,如何显示活动指示器?的主要内容,如果未能解决你的问题,请参考以下文章

获取行数据时在表视图中显示活动指示器

UISearchDisplayController 活动指示器

从服务器获取数据时如何显示活动指示器

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]

是否可以更改 Wicket 活动指示器的颜色?

如何使用图像而不是活动指示器?