Как мультиселектировать элементы в flatlist реагируют на родные - PullRequest
2 голосов
/ 11 ноября 2019

Как выбрать несколько элементов и выделить их в собственном плоском списке. Я проверил документ . Но это немного сбивает с толку, кто-нибудь может мне помочь. Я сделал одиночный выбор, используя этот метод. Может ли кто-нибудь изменить это на множественный выбор. Я дам здесь ссылку для перекуса, где я сделал одиночный выбор

import * as React from 'react';
import {
  Text,
  View,
  StyleSheet,
  FlatList,
  TouchableOpacity,
} from 'react-native';
import Constants from 'expo-constants';

const Data = [
  {
    id: 1,
    first_name: 'Sile',
  },
  {
    id: 2,
    first_name: 'Clementia',
  },
  {
    id: 3,
    first_name: 'Brita',
  },
  {
    id: 4,
    first_name: 'Duke',
  },
  {
    id: 5,
    first_name: 'Hedvig',
  },
  {
    id: 6,
    first_name: 'Paulie',
  },
  {
    id: 7,
    first_name: 'Munmro',
  },
  {
    id: 8,
    first_name: 'Dyanna',
  },
  {
    id: 9,
    first_name: 'Shanta',
  },
  {
    id: 10,
    first_name: 'Bambi',
  },
];

// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedItem: null,
    };
  }

  onPressHandler(id) {
    this.setState({ selectedItem: id });
  }

  render() {
    return (
      <View>
        <FlatList
          extraData={this.state.selectedItem} //Must implemented
          //horizontal={true}
          data={Data}
          keyExtractor={item => item.id.toString()}
          showsHorizontalScrollIndicator={false}
          renderItem={({ item }) => (
            <TouchableOpacity onPress={() => this.onPressHandler(item.id)}>
              <Card
                style={
                  this.state.selectedItem === item.id
                    ? {
                        padding: 10,
                        borderRadius: 5,
                        backgroundColor: '#000000',
                      }
                    : {
                        padding: 10,
                        borderRadius: 5,
                        backgroundColor: '#a1a1a1',
                      }
                }>
                <Text>{item.first_name}</Text>
              </Card>
            </TouchableOpacity>
          )}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({

});

этообразец данных

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Я внес некоторые изменения и сделал ваш плоский список мультиселектом. Перейдите по этой ссылке .

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

  • Добавил фиктивные данные в состоянии и передал их в данные плоского списка.
  • На элементе нажмите итерацию данных и для соответствующего набора элементов item.selected=true.
  • Внутри renderItem плоского списка, если item.selected==true, тогда показать выбор, иначе удалить выбор.

Пожалуйста, проверьтеи дай мне знать.

0 голосов
/ 11 ноября 2019

проверьте эту логику,

 ...
     this.state = {
          clientsArray: clientsArray,
          selectedClients: []
        };
    //'clientsArray' is your data array
 ...

  _renderCell = ({ item, index }) => {
    const { selectedClients, clientsArray } = this.state;
    let isSelected =
      selectedClients.filter(o => {
        return o.id === item.id;
      }).length > 0
        ? true
        : false;

   //change your UI based on the 'isSelected' value
   return (
      <TouchableOpacity
        activeOpacity={Constants.ACTIVE_OPACITY}
        onPress={() => {
          this._didSelectClient(item);
        }}
      >
       {
         //Your component
       }
      </TouchableOpacity>
 }


_didSelectClient = selectedItem => {
    let selectedClients = this.state.selectedClients;
    let isItemSelected =
      selectedClients.filter(item => {
        return item.id.includes(selectedItem.id);
      }).length > 0
        ? true
        : false;

    if (isItemSelected) {
      const index = selectedClients.findIndex(
        obj => obj.id === selectedItem.id
      );
      selectedClients.splice(index, 1);
    } else {
      selectedClients.push(selectedItem);
    }

    this.setState({ selectedClients });
  };

render() {
    ...
    <FlatList
     style={{ flex: 1 }}
     data={clientsArray}
     renderItem={this._renderCell}
     keyExtractor={(item, index) => index.toString()}
     extraData={this.props}
     ListEmptyComponent={this._renderEmptyComponent}
    />
    ...
}
...