2016-06-21 9 views
2

現在、私は反応ネイティブを学習しており、ListViewの問題に悩まされています。私はTextInputからListViewのデータを検索したいと思うし、結果はListViewにもあると思います。ListViewの検索データはネイティブに反応します

は、ここに私はこれまで何をやったかです:

var PageOne = React.createClass({ 
 
    getInitialState:function(){ 
 
    return{ 
 
     dataSource: new ListView.DataSource({ 
 
     rowHasChanged: (row1, row2) => row1 !== row2, 
 
     }), 
 
     loaded: false, 
 
     colorProps: { 
 
     titleColor: 'white', 
 
     }, 
 
     searchText:"", 
 
    } 
 
    }, 
 

 
    componentDidMount() { 
 
    this.fetchData(); 
 
    }, 
 

 
    fetchData() { 
 
    fetch(REQUEST_URL) 
 
     .then((response) => response.json()) 
 
     .then((responseData) => { 
 
     this.setState({ 
 
      dataSource: this.state.dataSource.cloneWithRows(responseData.movies), 
 
      loaded: true, 
 
     }); 
 
     }) 
 
     .done(); 
 
    }, 
 

 
    setSearchText(action){ 
 
    let searchText = event.nativeEvent.text; 
 
    this.setState({searchText}); 
 

 
    /* 
 
    * 
 
    * 
 
    */ 
 

 
    }, 
 

 
    render() { 
 
    return (
 
     <View style={{ flex: 1 }}> 
 
     <ToolbarAndroid 
 
      title="Movies" 
 
      {...this.state.colorProps} 
 
      style={{height:40, backgroundColor:'blue'}} 
 
      /> 
 
     <TextInput 
 
      placeholder="Search movies......." 
 
      value={this.state.searchText} 
 
      onChange={this.setSearchText.bind(this)} /> 
 
     <ListView 
 
     dataSource={this.state.dataSource} 
 
     renderRow={this.renderMovie} 
 
     style={styles.listView} 
 
     /> 
 
     </View> 
 
    ); 
 
    }, 
 

 
    renderMovie(movie) { 
 
    return (
 
    <TouchableOpacity onPress={this._handlePressList.bind(this, movie)}> 
 
     <View style={styles.container}> 
 
     <Image 
 
      source={{uri: movie.posters.thumbnail}} 
 
      style={styles.thumbnail} 
 
     /> 
 
     <View style={styles.rightContainer}> 
 
      <Text style={styles.title}>{movie.title}</Text> 
 
      <Text style={styles.year}>{movie.year}</Text> 
 
     </View> 
 
     </View> 
 
    </TouchableOpacity> 
 
    ); 
 
    },

私は次に何をすることが出来るのですか?助けてください。ありがとう:)

更新!後urbancvekからの回答を読んで、私はこのようなsetSearchText()方法で機能を追加します。

setSearchText(event){ 
 
    const searchText = event.nativeEvent.text; 
 
    
 
    moviesLength = this.state.movies.length; 
 
    aMovie = this.state.movies; 
 

 
    const filteredMovies = this.state.movies.filter(checkTitle); 
 
    console.log("movies: " + JSON.stringify(filteredMovies)); 
 

 
    function checkTitle() { 
 
     for(i=0;i<moviesLength;i++){ 
 
      if(aMovie[i].title === searchText){ 
 
      console.log("found: " + aMovie[i].title); 
 
      return aMovie[i]; 
 
      } 
 
     } 
 
    } 
 
    
 
    this.setState({ 
 
     searchText, 
 
     dataSource: this.state.dataSource.cloneWithRows(filteredMovies), 
 
    }); 
 
    },

しかし、それは、常に1つのフィルタリングされません、私のすべてのムービーを表示します。何か案は?ありがとう

+0

あなたの 'checkTitle()'フィルタ関数は、一致すると_all_ moviesを返します。 'aMovie'配列を繰り返し処理する必要はありません。代わりに、' checkTitle(movie) 'を' return movie.title.startsWith(searchText);に変更するだけです。 – Bataleon

答えて

1

。検索フィールドが変更されるたびに、このデータと対話します。

fetchData() { 
    fetch(REQUEST_URL) 
     .then((response) => response.json()) 
     .then((responseData) => { 
     this.setState({ 
      dataSource: this.state.dataSource.cloneWithRows(responseData.movies), 
      movies: responseData.movies, 
      loaded: true, 
     }); 
     }).done(); 
}, 

は、今すぐあなたの setSearchText()方法であなたはあなたが fetchData()状態に保存された動画から必要な映画を見つけるいくつかのフィルタ機能を含める必要があります。

setSearchText(action){ 
    const searchText = event.nativeEvent.text; 
    const filteredMovies = this.state.movies.filter(/* awesome filter function */); 

    this.setState({ 
     searchText, 
     dataSource: this.state.dataSource.cloneWithRows(filteredMovies); 
    }); 
}, 

ListViewを更新するたびに、そのデータソースを更新する必要があります。 ListViewコンポーネントは、表示されているデータが変更されたことを認識することができます。

希望しました。

+0

質問に私の作品のアップデートを追加しました。 – sptra

+0

それは解決しました! obj.indexOf(searchText)を含む関数を 'setSearchText()'メソッドに追加すると動作します。非常に@urbancvekありがとう:) – sptra

0

リストビュー内のデータを検索するのは、基本的には、リンクされたリストまたは配列内のデータを検索することだけです。データソースまたはデータブロブで入力と検索を行います。線形検索やバイナリ検索を好きな方で使うことができます。 Facebookのから

関連する問題