RN: Выровняйте элементы в ряду слева и справа

Вот компонент RN (0.59), использующий sectionList для отображения имени события в строке. renderItem отображает 3 элемента подряд, начиная с изображения головы (левое изображение), затем имя события, заканчивая другим изображением головы (правое изображение).

render() {
       return (
        <View  style={styles.container}>
          <SectionList
              sections={this.state.activeEvents} 
              renderItem={({item, section}) => {return (
                                                <View style={styles.container}>
                                                  <Image style={styles.image} source={{uri: item.image}}/>
                                                  <TouchableOpacity onPress={() => {this._onPress(item.id)}} >
                                                    <Text style={styles.item} key={item.id}>{item.name}</Text>
                                                  </TouchableOpacity>
                                                  <View style={styles.containerRight}>
                                                    <Image style={styles.image} source={{uri: "https://bootdey.com/img/Content/avatar/avatar1.png"}}/>
                                                  </View>
                                                </View>)}}

              renderSectionHeader={({section}) => <Text style={styles.sectionHeader}>{section.title}</Text>}
              keyExtractor={(item, index) => item + index}
            />
        </View>
      ); 

      }

}

const styles = StyleSheet.create({
    container: {
      flex: 1,
      paddingTop: 22,
      paddingVertical: 12,
      flexDirection: 'row',
      alignItems: 'flex-start',
      flexDirection: 'row',
      alignItems: 'flex-start'
    },
    containerRight: {
      flex: 1,
      paddingTop: 22,
      paddingVertical: 12,
      flexDirection: 'row',
      alignItems: 'flex-end',
      flexDirection: 'row',
      alignItems: 'flex-end' 
    },
    sectionHeader1: {
      paddingTop: 2,
      paddingLeft: 10,
      paddingRight: 10,
      paddingBottom: 2,
      fontSize: 14,
      fontWeight: 'bold',
      backgroundColor: 'rgba(247,247,247,1.0)',
    },
    sectionHeader:{
      backgroundColor : '#64B5F6',
      fontSize : 20,
      padding: 5,
      color: '#fff',
      fontWeight: 'bold'
   },
    item: {
      padding: 10,
      fontSize: 18,
      height: 44,
    },
    image:{
      width:45,
      height:45,
      borderRadius:20,
      marginLeft:20
    },
    imageRight:{
      width:45,
      height:45,
      borderRadius:20,
      marginRight:20
    },
  }) 

Вот результат приведенного выше рендера:

введите здесь описание изображения

Все элементы строки (левое изображение, название события, правое изображение) должны быть выровнены по вертикали. Левое изображение и название события правильно выровнены по левой стороне строки, но правое изображение должно быть выровнено по горизонтали по правой стороне строки. Как я могу изменить свой jsx и стиль для достижения этого пользовательского интерфейса?


person user938363    schedule 17.06.2019    source источник
comment
Вы хотите, чтобы между двумя изображениями было пространство? Другими словами, вы хотите выровнять левое изображение по левому краю, а правое по правому?   -  person mahan    schedule 17.06.2019
comment
да, левое изображение слева и правое изображение справа! Название события находится сразу после левого изображения.   -  person user938363    schedule 17.06.2019
comment
stackoverflow .com/questions/36008969/ Похоже, alignItems: "flex-end" не работает. Пробовали ли вы использовать другой контент вместо нужного изображения?   -  person mahan    schedule 17.06.2019
comment
Нет, я не пытался использовать другой контент. Я могу использовать что-то вроде значка или гамбургского меню. Опубликованное решение может работать здесь.   -  person user938363    schedule 18.06.2019


Ответы (1)


Я полагаю, вы хотели бы что-то вроде этого:

Вы можете сделать это, добавив большой контейнер для строки и добавив:

justifyContent: 'space-between'

Оберните исходный код и исправьте его в соответствии с вашими потребностями или посмотрите рабочую закуску: snack.expo.io /@abranhe/stackoverflow-56638124

import React, { Component } from 'react';
import {
  SectionList,
  Text,
  Image,
  View,
  TouchableOpacity,
  StyleSheet,
} from 'react-native';

const events = [
  {
    title: '2019-04-03',
    data: [
      {
        name: 'Event 1',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar1.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar2.png',
        },
      },
      {
        name: 'Event 2',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar3.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar4.png',
        },
      },
    ],
  },
  {
    title: '2019-04-07',
    data: [
      {
        name: 'Event 2',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar5.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar6.png',
        },
      },
    ],
  },
];

export default class App extends Component {
  onPressEvent = id => {
    alert(eventName);
  };

  render() {
    return (
      <SectionList
        style={styles.selectionList}
        sections={events}
        renderItem={({ item: event, section }) => {
          return (
            <View style={styles.container}>
              <View style={styles.content}>
                <Image style={styles.image} source={event.imageLeft} />
                <TouchableOpacity onPress={() => this.onPressEvent(event.name)}>
                  <Text>{event.name}</Text>
                </TouchableOpacity>
                <Image style={styles.image} source={event.imageRight} />
              </View>
            </View>
          );
        }}
        renderSectionHeader={({ section }) => (
          <Text style={styles.sectionHeader}>{section.title}</Text>
        )}
        keyExtractor={(item, index) => item + index}
      />
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 22,
  },
  content: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
  },
  selectionList: {
    marginTop: 22,
  },
  sectionHeader: {
    backgroundColor: '#64B5F6',
    fontSize: 20,
    padding: 5,
    color: '#fff',
    fontWeight: 'bold',
  },
  image: {
    width: 45,
    height: 45,
    borderRadius: 20,
    margin: 20,
  },
});

Если у вас есть какие-либо вопросы, дайте мне знать!

Обновление после комментария автора вопроса

Это выглядит близко. Но я не смог провести тест с момента моего сообщения из-за ошибки, связанной с AndroidX. Можете ли вы переместить event.name влево сразу после левого изображения? Для значка справа он может быть изменен на гамбургер-меню.

Было бы легко просто обернуть левый значок в

<View>
  <Image/>
  <Text>Some Text</Text>
</View>

то это будет выглядеть так:

Смотрите обновленную закуску: snack.expo.io/@abranhe/stackoverflow-56638124-updated

<View style={styles.leftIcon}>
  <Image style={styles.image} source={event.imageLeft} />
  <TouchableOpacity onPress={() => this.onPressEvent(event.name)}>
    <Text>{event.name}</Text>
  </TouchableOpacity>
</View>

Затем добавьте следующий стиль:

leftIcon: {
  flexDirection: 'row',
  justifyContent: 'center',
  alignItems: 'center',
}
person abranhe    schedule 18.06.2019
comment
Это выглядит близко. Но я не смог провести тест с момента моего сообщения из-за ошибки, связанной с AndroidX. Можете ли вы переместить event.name влево сразу после левого изображения? Значок справа может быть изменен на гамбургское меню. - person user938363; 19.06.2019
comment
Да, чтобы переместить его влево, вам просто нужно поместить его в вид с левым логотипом, я делаю и закусываю, чтобы показать вам, смотрите обновление в посте - person abranhe; 19.06.2019