2016-12-31 6 views
8

Ich versuche, die List-Komponente verwenden, um eine Menge Eingaben zu verarbeiten, aber beachten Sie, dass es nach Eingabe der Eingabe nach oben zurück scrollt.NativeBase (React Native) vermeiden Scrollen nach oben

enter image description here

Sie wissen nicht, ob dies zu ListView always scrolls back to the top in react-native verwandt ist - Ich habe versucht, <List style={{flex> 1}} ..> aber kein Glück ..

UPDATE

dachte, es könnte leichter sein, mir zu helfen, wenn ich werfe in einigen Code

import React, { Component } from 'react' 
import { View } from 'react-native' 
import { List, ListItem, InputGroup, Input, Icon, Button } from 'native-base' 

export default class AddInformation extends Component { 
    constructor(props) { 
    super(props) 

    this.state = { 
     items: 
[ 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}, 
{value: "", keyboardType: "default"}]} 

} 

render() { 
    return (
     <List 
     dataArray={this.state.items} 
     renderRow={ 
      (obj) => { 
      console.log(obj) 
      return (
       <ListItem> 
       <InputGroup> 

       <Input 
        placeholder={`${obj.keyboardType} keyboard`} 
        onChangeText={ (text)=> { 
        //TODO 
        } } 
        keyboardType={obj.keyboardType} 
       /> 
       </InputGroup> 
       </ListItem> 
      ) 
     }}> 
     </List> 
    ) 
    } 
} 

UPDATE 2

noch nicht funktioniert ..

import React, { Component } from 'react' 
import { View, ListView, Text, TextInput } from 'react-native' 
import { FormLabel, FormInput } from 'react-native-elements' 

export default class AddInformation extends Component { 
    constructor(props) { 
    super(props) 
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 

    } 

    componentDidMount() { 
    this.state = { 
     items: ds.cloneWithRows([ 
     {hint: "foo", value: "", keyboardType: "default"}, 
     ... 
     {hint: "bar", value: "", keyboardType: "numeric"} 
     ]) 
    } 

    } 
... 

Und die Render-Methode:

render() { 
    return (
     <View style={{flex: 1}}> 
     <ListView 

      dataSource={this.state.Specifications} 
      renderRow={(rowData) => 
      <View> 
       <FormLabel>{rowData.hint}</FormLabel> 
       <FormInput 
       placeholder={`Keyboard: ${rowData.keyboardType}`} 
       /> 
       <TextInput /> 
      </View> 
      }/> 
     </View> 
    ) 
    } 
} 

Weiß nicht, ob es etwas mit dem NativeBase Layout zu tun hat ..?

import React, { Component } from 'react' 
import { Container, Content, Header, Title, Button, Icon } from 'native-base' 
import AddInformation from './AddInformation' 

export default class ScreenAddItemInformation extends Component { 
    render() { 
    return (
     <Container> 

     <Header> 
      <Button transparent onPress={() => this.props.navigator.pop() }> 
      <Icon name='ios-backspace' /> 
      </Button> 

      <Title>Add New Item</Title> 

     </Header> 

     <Content> 
      <AddInformation /> 
     </Content> 

     </Container> 
    ); 
    } 
} 

UPDATE 3

Ich habe gerade versucht, mit einem NB <List> harten <ListItem> und keinem dynamischen Rendering codierte out .. Es ist immer noch das Problem, dass, wenn die Tastatur an die Spitze der „Ansicht“ blättert geht wieder nach unten .

+0

Haben Sie die 'rowHasChanged' korrekt implementiert, so dass die bereits gerenderten Zeilen nicht gerendert werden? –

+0

@TudorConstantin nein ich nicht. Ich verwende NativeBase Dynamische Liste http://nativebase.io/docs/v0.5.13/components#list, die nur ein Array übergeben soll. – Norfeldt

+0

Können Sie Ihren Code dort hinzufügen, wo Sie this.state.items aktualisieren. Tudor Kommentar scheint richtig zu sein. Sie sollten versuchen, ListView direkt anstelle des List-Widgets zu verwenden.Je nachdem, wie Sie den Elementstatus festlegen, wird ListView möglicherweise die gesamte Liste erneut über das Listenwidget wiedergeben. – while1

Antwort

1

Nach der gleichen Frage zu NB forum veröffentlichen, ich eine nützliche Verbindung zu einem Weg kam zu lösen diese "Fehler":

https://github.com/GeekyAnts/NativeBase/issues/339

Komponenten/ScreenAddInformation.js:

import React, { Component } from 'react' 
import { Container, Content, Header, Title, Button, Icon } from 'native-base' 
import Information from './Information' 

export default class ScreenAddInformation extends Component { 
    constructor(props) { 
    super(props)  
    this.state = {scrollY: 0} 
    } 

handleScroll(event) { 
    this.setState({ scrollY: event.nativeEvent.contentOffset.y }); 
    } 

    render() { 
    _.set(this.refs, 'Content._scrollview.resetCoords', { x: 0, y: this.state.scrollY }); 
    return (
     <Container> 

     <Header> 
      <Button transparent onPress={() => this.props.navigator.pop() }> 
      <Icon name='ios-backspace' /> 
      </Button> 

      <Title>Add New Information</Title> 

     </Header> 

     <Content 
      ref="Content" 
      onScroll={event => this.handleScroll(event)} 
      > 
      <AddInformation /> 
     </Content> 

     </Container> 
    ); 
    } 
} 

Komponenten/AddInformation.js:

import React, { Component } from 'react' 
import { View, Text } from 'react-native' 
import { List, ListItem, InputGroup, Input } from 'native-base' 

export default class AddInformation extends Component { 
    render() { 
    return (
     <List> 
     <ListItem itemDivider> 
      <Text>Information to add</Text> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem > 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Foo" /> 
      </InputGroup> 
     </ListItem> 
     <ListItem> 
      <InputGroup borderType="underline"> 
      <Input stackedLabel label="Bar" /> 
      </InputGroup> 
     </ListItem> 
     </List> 
    ) 
    } 
} 

Und die Arbeitslösung ist hier:

enter image description here

Ich bin so froh, dass es jetzt funktioniert! thx booboothefool

+0

Leider funktionierte das nicht für mich .. Funktioniert es immer noch für Sie auf den neuesten Versionen der Bibliotheken? – jbouaziz

+0

Ich sorta ging vor einiger Zeit weg von nativebase ... So würde ich nicht wissen, tut mir leid – Norfeldt

+0

Keine Sorge, danke trotzdem! Gibt es einen Grund, warum du dich von ihm entfernt hast? – jbouaziz

0

Was passiert, wenn Sie einfach die Tastatur beim Senden verbergen? Versuchen Sie, eine Abhilfe wie folgt aus:

<TextInput onSubmitEditing={() => Keyboard.dismiss() }> 

Vergessen Sie nicht, {} Tastatur importieren von ‚reagieren-native‘

+0

Vielen Dank für einen guten Vorschlag, aber wird es funktionieren, wenn ich draußen (auf der Liste) drücken und das Keyvboard ausfällt? Ist das das gleiche - weil ich nur eine onFocus-Prop und nicht einen offFocus sehe – Norfeldt

+1

Sie können auch eine onBlur zum TextInput hinzufügen, was das Gegenteil von onFocus ist. –

+0

Vielen Dank für den Vorschlag, aber es funktioniert nicht. – Norfeldt

Verwandte Themen