Реагировать на собственный плоский список 2 элемента в строке, ширина не равна

Я создаю собственное приложение для реагирования и пытаюсь сделать 2 элемента в строке одинаковой ширины в flatList. то, что я получаю, это 2 элемента в строке, но не одинаковой ширины.

const itemProduct = props => {
return (
    <Button style = {style.container} onPress = {props.onPress}>
        <View style = {style.imageContainer}>
            <LoadingImage resizeMode='contain' resizeMethod='resize' source = {props.Image ? { uri: 'https://www.saramashkim.co.il/'+props.Image } : require('../../assets/images/default_no_image.png')} style = {style.image} />
        </View>
        <View style = {style.textContainer}>
            <Text style = {style.productName}>vodka</Text>
            <View style = {style.specialOffer}>
                {props.inPromotion ? <Text>special offer</Text> : null}
            </View>

            <View style = {style.bottomLine}>
                <Text style = {style.costText}>lorem ipos</Text><View style = {style.bottomLine}>{props.discount ? <Text style = {style.Price}>lorem ipos{parseFloat(Math.round(props.price_per_case * 100) / 100).toFixed(2)}</Text> : null}<Text style = {style.discountPrice}>dollar{parseFloat(Math.round(props.price_per_case * ((100 - props.discount) / 100) * 100) / 100).toFixed(2)}</Text></View>
            </View>
        </View>
    </Button>
    )
}

стиль

const style = StyleSheet.create({
container : {
    backgroundColor: colors.dark_red,
    paddingTop:calcSize(10),
    margin:calcSize(10),
    minWidth:(width-15)/2,

},
imageContainer:{
    flex:1,  
    alignItems:'center'
},
textContainer:{
    flex:2,
    //backgroundColor:'red',
    paddingHorizontal:calcSize(30)
},
image:{ 
    width: calcSize(175), 
    height: calcSize(175) 
},
brandName:{
    color:'#7c7c7c',
    fontFamily:'Poppins-Light',
    fontSize:calcSize(25),
    marginBottom:calcSize(15)
},
productName:{
    color: colors.black,
    fontFamily:'Poppins-Regular',
    fontSize:calcSize(20),
    width:calcSize(300)

},

flatList

<View style = {style.list}>
   <FlatList
       refreshing = {this.state.refreshing}
       numColumns = {2}
       onRefresh = {this.onListRefresh}
       data = {products}
       keyExtractor = {(o, i) => i.toString()}
       renderItem = {this.renderProductListItem}
       ListFooterComponent = {() => {
          if ((this.state.products.length < this.state.totalFound || this.state.loading) && !this.state.refreshing)
             return <Spinner style = {style.loading} />
             return <View style = {style.loading} />
          }}

          ItemSeparatorComponent = {() => <View style = {style.separator} />} />
   </View>
</View>

стиль списка

list:{
    flex:1,
    flexDirection:'row',
    paddingHorizontal: calcSize(30),
}

Фото Реагировать на собственный плоский список 2 элемента в строке, ширина не равна

Я хочу сделать 2 элемента в строке одинаковой ширины, также на фотографии, поскольку вы можете видеть, что текст слева не равен правому, поэтому это проблема.

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

Rajendran Nadar 20.04.2018 17:40

Где твой ответ?

Manspof 20.04.2018 17:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
2
5 900
2

Ответы 2

Используйте flexbox с flexbasis и flex grow, попробуйте это

<View style = {{flex: 1, flexDirection: 'row', flexWrap: 'wrap', flexGrow: 0}}>
   <View style = {{flexBasis: '50%', height: 50, backgroundColor: 'powderblue'}} />
   <View style = {{flexBasis: '50%', height: 50, backgroundColor: 'skyblue'}} />
   <View style = {{flexBasis: '50%', height: 50, backgroundColor: 'steelblue'}} />
   <View style = {{flexBasis: '50%', height: 50, backgroundColor: 'blue'}} />
</View>

Проверено на моем устройстве Android.

Живая демонстрация здесь! Попробуйте

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

Где ширина?

Manspof 20.04.2018 17:43

flexBasis - это отличный способ добавить свойство ширины с помощью flexbox ..! Дайте мне 2 минуты, я добавлю живую демонстрацию

Rajendran Nadar 20.04.2018 17:44

Я жестко закодировал эти элементы, но вы всегда можете динамически извлекать данные из api и соответствующим образом визуализировать!

Rajendran Nadar 20.04.2018 17:50

Проверить живую демонстрацию

Rajendran Nadar 21.04.2018 20:24

Я проверил, но вот ищу способ с плоским списком с динамическими данными. у меня это не работает.

Manspof 21.04.2018 20:32

Пожалуйста, поставьте похожую демонстрацию на закуску, это трудно понять

Rajendran Nadar 23.04.2018 17:31

Прямо сейчас вы исключительно установили width дочернего элемента как minWidth:(width-15)/2, margin как margin:calcSize(10),padding для основного контейнера как paddingHorizontal: calcSize(30), который вызывает проблему.

Если вы хотите пойти по пути minWidth, вам необходимо правильно рассчитать интервал.

minWidth = (screenWidth - (paddingHorizontal * 2) - (margin * 2) - (separatorWidth)) / 2 = (screenWidth - 80) / 2

Поскольку в вопросе не упоминается separatorWidth

  • paddingHorizontal: Настройка paddingHorizontal аналогична настройке как для paddingLeft, так и для paddingRight.
  • margin: Установка поля имеет тот же эффект, что и установка каждого из marginTop, marginLeft, marginBottom и marginRight.

    list:{
        flex:1,
        paddingHorizontal: calcSize(30),
    },
    container : {
        flex: 1, //<== Either add a height or a flex
        backgroundColor: 'darkred',
        paddingTop:calcSize(10),
        margin:calcSize(10),
        minWidth:(width-80)/2,
    
    },
    

Лучшим подходом было бы использование height и flex, чтобы можно было соответствующим образом масштабировать width.

Вот закуска демонстрация

Другие вопросы по теме