Ich habe eine horizontale flache Liste, in der jeder Artikel width:300
Ist. Ich versuche nur, den Index des aktuell sichtbaren Artikels abzurufen.
<FlatList
onScroll={(e) => this.handleScroll(e)}
horizontal={true}
data={this.state.data}
renderItem...
Versuchte dies:
handleScroll(event) {
let index = Math.ceil(
event.nativeEvent.contentOffset.x / 300
);
Und so ähnlich:
handleScroll(event) {
let contentOffset = event.nativeEvent.contentOffset;
let index = Math.floor(contentOffset.x / 300);
aber nichts ist genau Ich bekomme immer einen Index nach oben oder einen nach unten.
Was mache ich falsch und wie erhalte ich den korrekten aktuellen Index in einer flachen Liste?
Ich erhalte zum Beispiel den 8. Platz in einer Liste, aber den Index 9 oder 10.
[~ # ~] upd [~ # ~] . Danke an fzyzcjy für den Hinweis, dass onViewableItemsChanged nicht aktualisiert werden sollte
Sie können FlatList onViewableItemsChanged
verwenden, um das zu bekommen, was Sie wollen.
class Test extends React.Component {
onViewableItemsChanged = ({ viewableItems, changed }) => {
console.log("Visible items are", viewableItems);
console.log("Changed in this iteration", changed);
}
render () => {
return (
<FlatList
onViewableItemsChanged={this.onViewableItemsChanged }
viewabilityConfig={{
itemVisiblePercentThreshold: 50
}}
/>
)
}
}
viewabilityConfig
kann Ihnen dabei helfen, die gewünschten Einstellungen für die Sichtbarkeit vorzunehmen. Im Codebeispiel 50
bedeutet, dass das Element als sichtbar betrachtet wird, wenn es für mehr als 50 Prozent sichtbar ist.
Die Konfigurationsstruktur finden Sie hier
this.handleScroll = (event) => {
let yOffset = event.nativeEvent.contentOffset.y
let contentHeight = event.nativeEvent.contentSize.height
let value = yOffset / contentHeight
}
<FlatList onScroll={this.handleScroll} />
Ermitteln Sie den Rundungswert zur Berechnung der Seitenzahl/des Index.
Vielen Dank an die am häufigsten gewählte Antwort :) Es funktioniert jedoch nicht, wenn ich es versuche und einen Fehler auslöst, der besagt, dass changing onViewableItemsChanged on the fly is not supported
. Nach einiger Suche finde ich die Lösung hier . Hier ist der vollständige Code, der fehlerfrei ausgeführt werden kann. Der entscheidende Punkt ist, dass die beiden Konfigurationen als Klasseneigenschaften anstatt innerhalb der render () -Funktion abgelegt werden sollten.
class MyComponent extends Component {
_onViewableItemsChanged = ({ viewableItems, changed }) => {
console.log("Visible items are", viewableItems);
console.log("Changed in this iteration", changed);
};
_viewabilityConfig = {
itemVisiblePercentThreshold: 50
};
render() {
return (
<FlatList
onViewableItemsChanged={this._onViewableItemsChanged}
viewabilityConfig={this._viewabilityConfig}
{...this.props}
/>
</View>
);
}
}
Mit verwandten @ fzyzcjy's und @ Roman's Antworten. Ab Version 16.8 können Sie mit uscCallback
das changing onViewableItemsChanged on the fly is not supported
Error.
function MyComponent(props) {
const _onViewableItemsChanged = useCallback(({ viewableItems, changed }) => {
console.log("Visible items are", viewableItems);
console.log("Changed in this iteration", changed);
}, []);
const _viewabilityConfig = {
itemVisiblePercentThreshold: 50
}
return <FlatList
onViewableItemsChanged={_onViewableItemsChanged}
viewabilityConfig={_viewabilityConfig}
{...props}
/>;
}