React-Native 应用程序的可折叠和可拖动部分列表

Posted

技术标签:

【中文标题】React-Native 应用程序的可折叠和可拖动部分列表【英文标题】:Collapsible and Draggable sectionList for React-Native application 【发布时间】:2020-01-04 09:50:00 【问题描述】:

我需要实现可折叠 sectionList 以及可拖动标题。 问题是我必须在使用 sectionList 作为列表视图的现有代码上实现可折叠和可拖动的功能,如果有人可以帮助我提供任何代码或建议,因为我是 React-Native 的新手并发现它非常好这个阶段比较难

【问题讨论】:

【参考方案1】:

您可以使用此react-native-collapsible 实现可折叠功能并添加 Draggable 支持[端口react-native-draggable-flatlist,但它不支持 SectionList。您必须将您的项目视为 section 。

借助这两个库,您可以完成这项任务。我已经为你创建了工作代码示例

import React,  Component  from "react";
import 
  View,
  TouchableOpacity,
  Text,
  SafeAreaView,
  StyleSheet
 from "react-native";
import DraggableFlatList from "react-native-draggable-flatlist";
import Collapsible from "react-native-collapsible";

class Example extends Component 
  state = 
    data: [
      
        id: 1,
        title: "Header1",
        data: ["item1", "item2", "item3", "item4"]
      ,
       id: 2, title: "Header2", data: ["item5", "item6", "item7", "item8"] ,
       id: 3, title: "Header3", data: ["item9", "item10", "item11", "item12"] 
    ],
    collapsibleItems: []
  ;

  _setCollapsible = id => 
    // clone ids
    const newIds = [...this.state.collapsibleItems];

    // check to add /remove id
    const index = newIds.indexOf(id);
    if (index > -1) 
      newIds.splice(index, 1);
     else 
      newIds.push(id);
    

    // set new ids
    this.setState( collapsibleItems: newIds );
  ;

  _renderSectionHeader(section, index, move, moveEnd) 
    return (
      <TouchableOpacity
        style=styles.sectionHeader
        onLongPress=move
        onPressOut=moveEnd
        onPress=() => this._setCollapsible(section.id)
      >
        <Text style=styles.sectionTitle>section.title</Text>
      </TouchableOpacity>
    );
  

  _renderSectionItems(section) 
    return (
      <View style=styles.sectionItems>
        section.data.map(item => (
          <Text style=styles.itemText key=item>
            item
          </Text>
        ))
      </View>
    );
    //return <View style= height: 100, backgroundColor: "green" ></View>;
  

  renderItem = ( item, index, move, moveEnd, isActive ) => 
    return (
      <React.Fragment>
        this._renderSectionHeader(item, index, move, moveEnd)
        <Collapsible collapsed=this.state.collapsibleItems.includes(item.id)>
          this._renderSectionItems(item)
        </Collapsible>
      </React.Fragment>
    );
  ;

  // collapsed=this.state.collapsibleIndex !== index

  render() 
    return (
      <SafeAreaView style= flex: 1 >
        <DraggableFlatList
          data=this.state.data
          renderItem=this.renderItem
          keyExtractor=(item, index) => `draggable-item-$item.id`
          scrollPercent=5
          onMoveEnd=( data ) => this.setState( data )
          extraData=this.state.collapsibleItems
        />
      </SafeAreaView>
    );
  


export default Example;

const styles = StyleSheet.create(
  sectionHeader: 
    backgroundColor: "#C0C0C0",
    padding: 20
  ,
  sectionTitle: 
    fontWeight: "bold",
    fontSize: 20
  ,
  sectionItems:  backgroundColor: "red" ,
  itemText:  padding: 20 
);

应用预览

【讨论】:

感谢 Mehran 提供的代码,我尝试了一个新项目,我正在努力拖动它,它正在弹跳,我需要做一些额外的事情还是我做错了什么? 拖动默认为长按。尝试长按项目,因为 onPress 将在 collapsible 上工作,我们还必须使 flatlist 可滚动。如果回答有帮助,请点赞并标记正确

以上是关于React-Native 应用程序的可折叠和可拖动部分列表的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 窗口滚动后的可拖动位置问题

iphone中的可扩展tableView

iphone中的可扩展tableView

jQuery 可拖放和可滚动的 div

jQuery draggable : 只能在一个 droppable 上拖动

如何防止 Resizable 和 Draggable 元素相互折叠?