【问题标题】:React native: change style of ListView item on touch反应原生:在触摸时更改 ListView 项目的样式
【发布时间】:2016-03-11 03:56:30
【问题描述】:

我想在按下该项目时更新 ListView 项目的样式,以便最终用户知道他/她选择了一个项目。

列表视图:

<ListView
    dataSource={this.state.dataSource}
    renderRow={this.renderFriend}
/>

行渲染器:

renderFriend(friend) {
  return (
    <TouchableHighlight onPress={ ??? }>
      <View style={styles.friendItem}>
        <View style={styles.profilePictureContainerNoBorder}>
          <Image
            source={{uri: 'https://graph.facebook.com/' + friend.id + '/picture?width=500&height=500'}}
            style={styles.profilePicture}
          />
        </View>
        <Text style={styles.profileName}>{friend.name}</Text>
      </View>
    </TouchableHighlight>
  );
}

当用户激活 TouchableHighlight 时,如何更改第二个视图的样式?

我还想将选定对象添加到选定对象数组中。

【问题讨论】:

    标签: javascript android listview reactjs react-native


    【解决方案1】:

    按下TouchableHighlight时,您应该使用组件状态并将选择的朋友ID存储在其中。

    类似:

    constructor(props) {
      super(props);
      this.state = {
        selectedFriendIds: [],
      }
    }
    
    selectFriend(friend) {
      this.setState({
        selectedFriendIds: this.state.selectedFriendIds.concat([friend.id]),
      });
    }
    
    renderFriend(friend) {
      const isFriendSelected = this.state.selectedFriendIds.indexOf(friend.id) !== -1;
      const viewStyle = isFriendSelected ?
        styles.profilePictureContainerSelected : styles.profilePictureContainerNoBorder;
    
      return (
        <TouchableHighlight onPress={ () => this.selectFriend(friend) }>
          <View style={styles.friendItem}>
            <View style={viewStyle}>
              <Image
                source={{uri: 'https://graph.facebook.com/' + friend.id + '/picture?width=500&height=500'}}
                style={styles.profilePicture}
              />
            </View>
            <Text style={styles.profileName}>{friend.name}</Text>
          </View>
        </TouchableHighlight>
      );
    }
    

    【讨论】:

    【解决方案2】:

    在返回所选元素的功能组件中,我使用选项 onPress={()=>onTouch(i)}

    'i' 是一个数组索引

    例如默认列表:

    export const HomePage = () => {
      const list = [
        {
          title: 'FFFFFFFFFF',
          icon: 'timer',
          idx: 1
        },
        {
          title: 'AAAAAAAAAAAAAAA',
          icon: 'place',
          idx: 2
        },
        {
          title: 'BBBBBBBBB',
          icon: 'info',
          idx: 3
        },
      ];
      const onTouch = (idTouch) => {
        console.log(idTouch);
      };
    
      return (
        <ScrollView>
          <View style={styles.section}>
            <Text style={styles.text}>TEXT1</Text>
            <Text style={styles.text2}>tEXT2</Text>
    
            {list.map((item, i) => (
              
              <TouchableOpacity on activeOpacity={0.7} key={i+1} style={styles.item} onPress={()=>onTouch(i)}>
                <ListItem key={i} bottomDivider >
                  <Icon name={item.icon} />
                  <ListItem.Content >
                    <ListItem.Title>{item.title}</ListItem.Title>
                  </ListItem.Content>
                  <ListItem.Chevron />
                </ListItem>
              </TouchableOpacity>
              
            ))}
          </View>
        </ScrollView>
      );
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多