se2*_*2as 6 react-native react-native-flatlist
我有一个 React-Native 应用程序,其中使用 FlatList 来显示从服务器获取的项目列表。该列表有 2 列,我需要列表项具有相同的高度。我在渲染列表项的代码周围放置了边框,但列表项的高度不同。我尝试过使用弹性盒设置来使视图填充容器,但我尝试的一切都没有什么区别。
我创建了应用程序的简化版本来说明该问题:
请注意,红色边框区域的高度不同。我需要让它们具有相同的高度。
灰色边框添加在包装负责列表项的组件的视图中,红色边框是负责列表项的组件的根视图。为了清楚起见,请参阅下面的代码。
我无法在应用程序中使用灰色边框,因为我的应用程序显示空框,而负责列表项的组件在呈现自身之前从服务器获取附加信息
此外,我不能使用固定的高度尺寸。
应用项目结构及代码
我的代码以“container.js”结尾的文件从服务器获取数据并将其传递到其匹配的渲染组件的方式进行分割。例如,“MainListContainer”将从服务器获取列表,然后将列表数据传递给“MainList”,“ListItemContainer”将从服务器获取有关单个列表项的附加信息,并将其传递给“ListItem”进行渲染实际项目。我已将此模型保留在我的简化应用程序中,以便它尽可能接近我的实际应用程序。
索引.js
import {AppRegistry} from 'react-native';
import MainListContainer from './app/components/MainListContainer';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => MainListContainer);
Run Code Online (Sandbox Code Playgroud)
MainListContainer.js
import React from 'react';
import MainList from './MainList';
const data = [
{id: '1', title: 'Item 1', subtitle: 'A', description: 'This is the first item.'},
{id: '2', title: 'Item 2', subtitle: 'B', description: 'The Big Brown Fox Jumped over the lazy dogs. The Big Brown Fox Jumped over the lazy dogs.',},
];
const MainListContainer = () => {
return ( <MainList items={data} /> );
};
export default MainListContainer;
Run Code Online (Sandbox Code Playgroud)
主列表.js
import React from 'react';
import {StyleSheet, FlatList, View} from 'react-native';
import ListItemContainer from './ListItemContainer';
export default class MainList extends React.Component {
constructor(props) {
super(props);
this.state = { numColumns: 2};
this.renderItem = this.renderItem.bind(this);
}
renderItem({item, index}) {
return (
<View style={styles.flatListItemContainer}> <!-- THIS IS WHERE THE GREY BORDER IS ADDED -->
<ListItemContainer key={index} item={item} />
</View>
);
}
render() {
const {items} = this.props;
const {numColumns} = this.state;
return (
<View>
<FlatList
data={items}
renderItem={this.renderItem}
numColumns={numColumns}
key={numColumns}
keyExtractor={(item) => item.id}
/>
</View>
);
}
};
const styles = StyleSheet.create({
flatListItemContainer: {
flex: 1,
margin: 10,
borderColor: '#ccc',
borderWidth: 1,
},
});
Run Code Online (Sandbox Code Playgroud)
ListItemContainer.js
import React from 'react';
import ListItem from './ListItem';
const ListItemContainer = (props) => {
const { item } = props;
return (
<ListItem item={item} />
);
};
export default ListItemContainer;
Run Code Online (Sandbox Code Playgroud)
ListItem.js
import React from 'react';
import {TouchableHighlight, View, StyleSheet, Image, Text} from 'react-native';
const ListItem = (props) => {
const { item } = props;
return (
<TouchableHighlight
underlayColor="white"
>
<View style={styles.containerView}> <!-- THIS IS WHERE THE RED BORDER IS ADDED -->
<View style={styles.top_row}>
<Image style={styles.image} source={require('../images/placeholder.png')} />
<View style={styles.title_texts}>
<Text style={{fontWeight:'bold'}}>{item.title}</Text>
<Text style={{color: 'rgb(115, 115, 115)'}}>{item.subtitle}</Text>
</View>
</View>
<Text>{item.description}</Text>
</View>
</TouchableHighlight>
);
};
export default ListItem;
const styles = StyleSheet.create({
containerView: {
padding: 14,
borderColor: 'red',
borderWidth: 1,
},
top_row: {
flex: 1,
flexDirection: 'row',
marginBottom: 10,
},
title_texts: {
flex: 1,
flexDirection: 'column',
},
image: {
alignSelf: 'flex-end',
resizeMode: 'cover',
height: 40,
width: 40,
marginRight: 20
},
});
Run Code Online (Sandbox Code Playgroud)
我尝试过的
| 归档时间: |
|
| 查看次数: |
3721 次 |
| 最近记录: |