仿微信或iOS 通讯录 列表,右侧字母联动加载功能

话不多说,直接上代码

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow
 */

import React, {Component} from 'react';
import {
    Platform,
    StyleSheet,
    Text,
    View,
    TouchableOpacity,
    Alert,
    SafeAreaView,
    SectionList,
    TouchableWithoutFeedback,
    TextInput,
    RefreshControl,
    ScrollView,
    FlatList,
    TouchableHighlight,
    Image,
    PixelRatio,
    Dimensions,
    StatusBar

} from 'react-native';
import {makePy} from "./app/getFirstAlphabet";
// import createInvoke from './app/native.js'
import createInvoke from 'react-native-webview-invoke/native'
import WebView from "react-native-webview";
import SideBar from "./app/SideBar";
import countries from './app/countryCode.json';
// import ReactNativeHapticFeedback from 'react-native-haptic-feedback';

const width = Dimensions.get('window').width;

const sectionMapArr = [
    ['A', 0],
    ['B', 1],
    ['C', 2],
    ['D', 3],
    ['E', 4],
    ['F', 5],
    ['G', 6],
    ['H', 7],
    ['I', 8],
    ['J', 9],
    ['K', 10],
    ['L', 11],
    ['M', 12],
    ['N', 13],
    ['O', 14],
    ['P', 15],
    ['Q', 16],
    ['R', 17],
    ['S', 18],
    ['T', 19],
    ['U', 20],
    ['V', 21],
    ['W', 22],
    ['X', 23],
    ['Y', 24],
    ['Z', 25],
];

export default class App extends Component {

    constructor(props) {
        super(props);
        this.state = {
            select: 'no',
            ps: [],
            offsetY: 0,
            sectionlist: React.createRef(),
        }
    }

    render() {
        const { select, key, show, showX, showY = -1000 } = this.state;
        return (
            <SafeAreaView style={styles.container}>
                <SectionList
                    ref={this.state.sectionlist}
                    onLayout={({ nativeEvent: { layout: { y }, }, }) => {
                        this.state.offsetY = y;
                    }}
                    onScrollToIndexFailed={() => {

                    }}
                    containerStyle={{ flex: 1, justifyContent: 'center' }}
                    ItemSeparatorComponent={() => (<View style={{ borderBottomColor: '#F8F8F8', borderBottomWidth: 1, }} />)}
                    renderItem={({ item, index, section }) => (
                        <View style={styles.itemContainer}>
                            <Text style={styles.itemText} key={index}>
                                {item.countryName}
                            </Text>
                        </View>
                    )}
                    renderSectionHeader={({ section: { key } }) => (
                        <View style={styles.headerContainer}>
                            <Text style={styles.headerText}>{key}</Text>
                        </View>
                    )}
                    sections={countries}
                    keyExtractor={(item, index) => item + index}
                />
                <View
                    style={{ width: 16, justifyContent: 'center', alignItems: 'center' }}
                    onStartShouldSetResponder={() => true}
                    onMoveShouldSetResponder={() => true}
                    onResponderGrant={evt => {
                        this.setState({
                            show: true,
                        });
                    }}
                    onResponderRelease={e => {
                        this.setState({
                            show: false,
                        });
                    }}
                    onResponderReject={() => {
                        console.log('onResponderReject');
                    }}
                    onResponderMove={({ nativeEvent: { pageX, pageY } }) => {
                        const offsetY = pageY - this.state.offsetY;
                        const find = this.state.ps.find(
                            i => i.min < offsetY && i.max > offsetY
                        );
                        if (find) {
                            const { key } = this.state;
                            if (find.key !== key) {
                                this.setState({
                                    key: find.key,
                                    showX: pageX,
                                    showY: find.min,
                                });
                                this.state.sectionlist.current.scrollToLocation({
                                    sectionIndex: find.index,
                                    itemIndex: 0,
                                    animated: false,
                                });
                                // ReactNativeHapticFeedback.trigger('impactLight', {
                                //     enableVibrateFallback: true,
                                //     ignoreAndroidSystemSettings: false,
                                // });
                            }
                        }
                    }}
                >
                    {sectionMapArr.map((item, index) => {
                        return (
                            <Text
                                key={index}
                                onLayout={({
                                               nativeEvent: {
                                                   layout: { x, y, width, height },
                                               },
                                           }) => {
                                    this.state.ps = this.state.ps.filter(i => i.key !== item[0]);
                                    this.state.ps.push({
                                        key: item[0],     // 对应的字母 A-Z
                                        min: y,           // 字母顶部Y坐标
                                        max: y + height,  // 字母底部Y坐标
                                        index: item[1],   // 字母对应SectionList的index
                                    });
                                }}
                            >
                                {item[0]}
                            </Text>
                        );
                    })}
                    {show && (
                        <View style={{
                            position: 'absolute', left: -60, top: showY - 10,borderRadius: 20,width: 60, height: 40,
                            flexDirection: 'row',
                        }}>
                            <View style={{
                                width: 40,
                                borderRadius: 20,
                                backgroundColor: '#999999',
                                alignItems: 'center',
                                justifyContent: 'center',
                            }}>
                                <Text style={{  fontSize: 30, color: '#FFFFFF',  }}>
                                    {key}
                                </Text>
                            </View>
                            <View style={{
                                position: 'absolute',
                                top: 3,
                                bottom: 3,
                                right: 0,
                                width: 30,
                                borderLeftColor: '#999999',
                                borderLeftWidth: 22,
                                borderTopColor: 'transparent',
                                borderTopWidth: 16,
                                borderBottomColor: 'transparent',
                                borderBottomWidth: 16,
                            }}>

                            </View>
                        </View>
                    )}
                </View>
            </SafeAreaView>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#FFFFFF',
        flexDirection: 'row',
    },
    headerContainer: {
        padding: 5,
        backgroundColor: '#F8F8F8',
    },
    headerText: {
        fontWeight: 'bold',
    },
    itemContainer: {
        paddingHorizontal: 5,
        paddingVertical: 10,
    },
    itemText: {
        fontSize: 16,
    },
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半身风雪

感谢打赏,你的鼓励,是我创作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值