Список разделов с использованием локального json react native

#react-native #react-native-android #react-native-ios

#react-native #react-native-ios

Вопрос:

У меня есть локальный файл json под названием Observer.json

     {
      "Observer": {
       "Category_2":[{
         "row1" : "Reading_1",
         "row2" : "Reading_2",
         "row3" : "Reading_3",
         "row4" : "Reading_4"
       }]
      }
    }

  

Я хочу отобразить эти данные, используя список разделов в react native. Там будет один раздел с заголовком Category_2 и 4 строками ie. Reading_1 и т.д. Пожалуйста, помогите, я не могу просмотреть какие-либо данные.

Вот код

 
    import React, { Component } from 'react';
    import { AppRegistry, View, Text,TouchableOpacity, ListView, StyleSheet,SectionList } from 'react-native';
    import { createStackNavigator,createAppContainer } from "react-navigation";

    const data_Custom = require('./Observer.json');

    class RenderList extends Component {

      static navigationOptions = {
        title: 'List Items'
      };

      constructor() {
      super();
      var ds = new ListView.DataSource({
        rowHasChanged: (r1, r2) => r1 !== r2,
        sectionHeaderHasChanged: (h1, h2) => h1 !== h2,
      });

      this.state = {
      dataSource: ds.cloneWithRowsAndSections({dataBlob: data_Custom}, {sectionIdentities:["Category_2"]}, {rowIdentities:["row1","row2","row3","row4"]} ),
      };
    }

     renderRow(custom){
      return (
       <View >
         <Text style = { styles.container2 }>
          {custom.rowIdentities}
         </Text>
       </View>
      );
     }

     renderSectionHeader(custom_s) {
      return (
        <Text style = { styles.container2 }>
         {custom_s.sectionIdentities}
        </Text>
      )
     }

     render() {
      return (
        <ListView
         dataSource={this.state.dataSource}
         renderRow={this.renderRow.bind(this)}
         renderSectionHeader={this.renderSectionHeader}
        />
      );
     }
    }

    const App = createStackNavigator({
      List: { screen: RenderList },
    });

    export default createAppContainer(App);

    const styles = StyleSheet.create({
      container1:{
       flex: 1
      },
      container2:{
       flex: 1,
       justifyContent: 'center',
       alignItems: 'center',
       paddingHorizontal: 15,
       fontSize: 18
      },
      item:{
       padding: 15
      },
      text:{
       fontSize: 18
      },
      separator:{
       height: 2,
       backgroundColor: 'rgba(0,0,0,0.5)'
      }
    });

  

Ответ №1:

Можете ли вы попробовать следующее?

Сначала измените json файл следующим образом,

  [
   {
      "title":"Observer",
      "data":[
         {"row" : "Reading_1"},
         {"row" : "Reading_2"},
         {"row" : "Reading_3"},
         {"row" : "Reading_4"}
       ]
    }
  ...
 ]
  

Затем используйте SectionList вместо ListView , потому что ListView не рекомендуется.

 import React, { Component } from 'react';
    import { AppRegistry, View, Text,TouchableOpacity, StyleSheet,SectionList } from 'react-native';
    import { createStackNavigator,createAppContainer } from "react-navigation";

    const data_Custom = require('./Observer.json');

    class RenderList extends Component {

     static navigationOptions = {
       title: 'List Items'
     };

     constructor() {
      super();
     this.state = {
      dataSource: data_Custom,
     };
    }

     renderRow(item){
      return (
       <View>
         <Text style = { styles.container2 }>
          {item.row}
         </Text>
       </View>
      );
     }

     renderSectionHeader(title) {
      return (
        <Text style = { styles.container2 }>
         {title}
        </Text>
      )
     }

     render() {
      return (
        <SectionList
         renderItem={({item, index, section}) => this.renderRow(item)}
         renderSectionHeader={({section: {title}}) => this.renderSectionHeader(title)}
         sections={this.state.dataSource}
         keyExtractor={(item, index) => item   index}
        />
      );
     }
    }

    const App = createStackNavigator({
      List: { screen: RenderList },
    });

    export default createAppContainer(App);

    const styles = StyleSheet.create({
      container1:{
       flex: 1
      },
      container2:{
       flex: 1,
       justifyContent: 'center',
       alignItems: 'center',
       paddingHorizontal: 15,
       fontSize: 18
      },
      item:{
       padding: 15
      },
      text:{
       fontSize: 18
      },
      separator:{
       height: 2,
       backgroundColor: 'rgba(0,0,0,0.5)'
      }
    });
  

Комментарии:

1. Привет .. спасибо за ответ, Джебин…. Но я все еще получаю ошибку — Инвариантное нарушение: ItemwithSeperator (…): из рендеринга ничего не было возвращено. Обычно это означает, что оператор return отсутствует . Или, чтобы ничего не отображать, верните null .

2. Привет, сейчас я только что обновил код, пожалуйста, используйте его. Обновлено в файле JSON и методе ‘renderRow’ и методе ‘render’.