React Native ListView:渲染文本不可选

时间:2017-02-02 18:02:45

标签: listview text react-native jquery-ui-selectable

我是React Native的新手,正在测试ListView。我使用selectable = {true}将每行渲染为Text,但我无法在任何行中选择任何文本。

我无法找到原因,谷歌搜索没有给我任何东西。

我该怎么做才能在ListView的每一行中选择文本?

我的测试代码:

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  ListView,
  ScrollView,
  TouchableHighlight,
} from 'react-native';

class Item extends Component {
  onPress = () => {
    console.log(`Item: component pressed: ${this.props.itemObj.name} `);
  };

  render() {
    {/*<TouchableHighlight onPress={this.onPress} underlayColor='greenyellow'>*/}
    return (
      <TouchableHighlight>
        <Text style={styles.item} selectable={true}>
          {this.props.itemObj.name}
        </Text>
      </TouchableHighlight>
    );
  }
}

export default class ListViewTest extends Component {
  constructor(props) {
    super(props);
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 != r2 });
    this.state = {
      dataSource: ds.cloneWithRows([]),
    };
  }

  componentWillMount() {
    console.log("componentWillMount");
    let items = [];
    for (let i=0; i<30; i++) {
      items.push({name: "item" + i});
    }
    this.setState({dataSource: this.state.dataSource.cloneWithRows(items)});
  }

  renderRow = (itemObj) => {
    // console.log("renderRow(): ");
    // console.log(row);
    return <Item itemObj={itemObj} />;
    {/*return <Text style={styles.item} selectable={true}>test message</Text>*/}
  };

  render() {
    console.log("render");
    return (
      <ScrollView>
        <ListView
          style={styles.list}
          dataSource={this.state.dataSource}
          initialListSize={1}
          renderRow={this.renderRow}
          enableEmptySections={true}
        />
      </ScrollView>
    );

    // return (
    //   <ScrollView>
    //     <Item itemObj={{name: "item1"}} />
    //   </ScrollView>
    // );
  }
}

const styles = StyleSheet.create({
  list: {
    flex: 1,
  },
  item: {
    padding: 5,
    borderBottomColor : 'blue',
    borderStyle: 'solid',
    borderBottomWidth : 1,
  },
});

AppRegistry.registerComponent('ListViewTest', () => ListViewTest);

1 个答案:

答案 0 :(得分:0)

您可以更改Constructor。我认为您不会将数组加载到listview。您应该删除componentWillMount的包含。您可以将项目推送到构造函数内的数组。可以尝试此代码?

 import React, { Component } from 'react';
        import {
          AppRegistry,
          StyleSheet,
          Text,
          View,
          ListView,
          ScrollView,
          TouchableHighlight,
        } from 'react-native';

        class Item extends Component {
          onPress = () => {
            console.log(`Item: component pressed: ${this.props.itemObj.name} `);
          };

          render() {
            return (
             <View>
                <Text style={styles.item} selectable={true}>
                  {this.props.itemObj.name}
                </Text>
             </View>
            );
          }
        }

        export default class ListViewTest extends Component {
          constructor(props) {
            super(props);
            let items = [];
            for (let i=0; i<30; i++) {
              items.push({name: "item" + i});
            }
            const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 != r2 });
            this.state = {
              dataSource: ds.cloneWithRows([items]),
            };
          }

          renderRow = (itemObj) => {
              return <Item itemObj={itemObj} />;
             }
          };

          render() {
            console.log("render");
            return (
              <ScrollView>
                <ListView
                  style={styles.list}
                  dataSource={this.state.dataSource}
                  initialListSize={1}
                  renderRow={this.renderRow}
                  enableEmptySections={true}
                />
              </ScrollView>
            );

            // return (
            //   <ScrollView>
            //     <Item itemObj={{name: "item1"}} />
            //   </ScrollView>
            // );
          }
        }

        const styles = StyleSheet.create({
          list: {
            flex: 1,
          },
          item: {
            padding: 5,
            borderBottomColor : 'blue',
            borderStyle: 'solid',
            borderBottomWidth : 1,
          },
        });

        AppRegistry.registerComponent('ListViewTest', () => ListViewTest);