react native SectionList组件实现多选

如下图所示:

  

 

代码如下:

import React, { useRef, Component } from 'react';
import {
    Platform,
    Text,
    View,
    TextInput,
    TouchableOpacity,
    ScrollView,
    Image,
    Button,
    SectionList,
    StyleSheet,
    ToastAndroid,
    Dimensions,
    Alert,
} from 'react-native';

import Icon from 'react-native-vector-icons/Ionicons';
   const DATA = [
    {
        titleId: "1",
        titleName: "水果",
        data: [
            { id: '01', name: '香蕉', selected: false },
            { id: '02', name: '', selected: false },
            { id: '03', name: '葡萄', selected: false },
            { id: '04', name: '猕猴桃', selected: false },
            { id: '05', name: '苹果', selected: false },
            { id: '06', name: '桃子', selected: false },
            { id: '07', name: '西瓜', selected: false },
            { id: '08', name: '橘子', selected: false },
        ]
    },
    {
        titleId: "2",
        titleName: "菜品",
        data: [
            { id: '09', name: '辣椒', selected: false },
            { id: '10', name: '白菜', selected: false },
            { id: '11', name: '青菜', selected: false },
            { id: '12', name: '茄子', selected: false },
            { id: '13', name: '南瓜', selected: false },
            { id: '14', name: '土豆', selected: false },
            { id: '15', name: '西红柿', selected: false },
            { id: '16', name: '粉条', selected: false },
            { id: '17', name: '豇豆', selected: false },
            { id: '18', name: '牛肉', selected: false },
            { id: '19', name: '猪肉', selected: false },
            { id: '20', name: '鸡翅', selected: false },
            { id: '21', name: '鸡爪', selected: false },
            { id: '22', name: '鸭肉', selected: false },

        ]
    },

];

export default class TestScreen extends Component {
    constructor(props) {
        super(props);
        this.state = {
            sourceData: DATA,
            selectedItem: []//选中的项
        }
    };

    render() {return (
            <View style={styles.container}><SectionList
                        sections={this.state.sourceData}
                        keyExtractor={(item, index) => index.toString()}
                        extraData={this.state}
                        stickySectionHeadersEnabled={true}//吸顶效果
                        renderItem={this._renderItem}   //cell
                        renderSectionHeader={({ section: { titleName } }) => (
                            <View style={{ height: 40, justifyContent: 'center', backgroundColor: 'rgba(232,240,248,1)' }}>
                                <Text style={[, { color: "#0a3989", textAlign: 'center', fontSize: CommonVar.userStyle.titleFontSize + 2 }]}>{titleName}</Text>
                            </View>
                        )}
                        ItemSeparatorComponent={() => {
                            return <View style={{ borderWidth: 0.2, borderColor: "#d2d2d2" }} />
                        }}
                    />
            </View>
        )
    }

    _renderItem = (info) => {
        // console.log(info);
        if (info.item.selected == true) {
            return <TouchableOpacity onPress={this._itemPress.bind(this, info.item, info.index)}>
                <View style={{ height: 45, flexDirection: 'row', justifyContent: 'space-between', backgroundColor: '#FFFFFF' }}>
                    <Text style={{ marginLeft: 10, alignSelf: 'center', color: "#000000" }}>{info.item.name}</Text>
                    <Icon name="ios-checkmark-outline" color='blue' size={25} style={{ alignSelf: 'center', marginRight: 5 }} />
                </View>
            </TouchableOpacity>
        } else {
            return <TouchableOpacity onPress={this._itemPress.bind(this, info.item, info.index)}>
                <View style={{ height: 45, flexDirection: 'row', justifyContent: 'space-between', backgroundColor: '#FFFFFF' }}>
                    <Text style={{ marginLeft: 10, alignSelf: 'center', color: "#000000" }}>{info.item.name}</Text>
                    <Icon name="ios-square-outline" color='#d2d2d2' size={25} style={{ alignSelf: 'center', marginRight: 5 }} />
                </View>
            </TouchableOpacity>
        }
    }

    _itemPress(selectItem, index) {
        var $this = this;
        this.state.sourceData.forEach(function (item1, lev1Index) {
            item1.data.forEach(function (item2, lev2Index) {
                if (item2.id == selectItem.id) {
                    //循环数据是否存在,存在就移除
                    var isExist = false;
                    $this.state.selectedItem.forEach(function (obj, objIndex) {
                        if (obj.id == selectItem.id && obj.titleId == item1.titleId) {
                            //找到存在的对象删除掉
                            $this.state.selectedItem.splice(objIndex, 1);
                            isExist = true;
                        }
                    })
                    if (isExist == false) {
                        //不存在就加到集合中去
                        $this.state.selectedItem.push({ id: selectItem.id, titleId: item1.titleId });
                    }
                    $this.state.sourceData[lev1Index].data[index].selected = !selectItem.selected;
                }
            })
        })
        console.log(this.state.selectedItem)
        this.setState({ sourceData: this.state.sourceData })
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: "#FFFFFF"
    },
   

})

 

posted @ 2022-11-30 16:56  斌言  阅读(235)  评论(0编辑  收藏  举报