Вот компонент 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 и стиль для достижения этого пользовательского интерфейса?
да, левое изображение слева и правое изображение справа! Название события находится сразу после левого изображения.
alignItems: "flex-end" не работает. Пробовали ли вы использовать другой контент вместо нужного изображения?
Нет, я не пытался использовать другой контент. Я могу использовать что-то вроде значка или гамбургского меню. Опубликованное решение может работать здесь.





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

Вы можете сделать это, добавив большой контейнер для строки и добавив:
justifyContent: 'space-between'
Оберните исходный код и исправьте его под свои нужды или посмотрите рабочую закуску: закуска.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,
},
});
Если у вас есть какие-либо вопросы, дайте мне знать!
It looks close. But I was not able to do any test since my post because of an error related to AndroidX. Can you move the event.name to the left right after the left image? For the icon on the right, it may be changed to a hamburger menu
Было бы легко просто обернуть левый значок в
<View>
<Image/>
<Text>Some Text</Text>
</View>
то это будет выглядеть так:

Смотрите обновленную закуску: закуска.expo.io/@abranhe/stackoverflow-56638124-обновлено
<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',
}
Это выглядит близко. Но я не смог провести тест с момента моего сообщения из-за ошибки, связанной с AndroidX. Можете ли вы переместить event.name влево сразу после левого изображения? Значок справа может быть изменен на гамбургское меню.
Да, чтобы переместить его влево, вам просто нужно поместить его в вид с левым логотипом, я делаю и закусываю, чтобы показать вам, смотрите обновление в посте
Вы хотите, чтобы между двумя изображениями было пространство? Другими словами, вы хотите выровнять левое изображение по левому краю, а правое по правому?