Пока expo не позволит мне использовать базы данных Realm, я решил использовать Json и asyncstorage.Исходные данные в любом случае происходят из Json, поэтому для этого приложения имеет смысл оставить его как json.
У меня есть плоский список с отображением json.Слева от каждого элемента в списке находится значок звезды.
Когда я касаюсь каждого элемента в списке, звезда становится сплошной, указывая на то, что она нажата.Нажмите ее еще раз, значок будет контуром звезды, чтобы указать, что он был отменен.
Функция onpress
выглядит так, что эти символы являются именем данных JSON, данные JSON имеют 3 ключа... символ, имя и значок имя.Символ - это элемент в плоском списке, к которому прикасаются.
onPressListItem = ( symbol ) => {
for (var i = 0; i < this.state.symbols.length; i++){
if (this.state.symbols[i].symbol === symbol){
const copyOfSymbolsList = [...this.state.symbols];
if (copyOfSymbolsList[i].iconName === 'md-star') {
copyOfSymbolsList[i].iconName = 'md-star-outline';
} else {
copyOfSymbolsList[i].iconName = 'md-star';
}
this.setState({ symbols:copyOfSymbolsList });
}
}
}
Итак, как вы можете видеть выше, он в основном просто прокручивает весь массив json, чтобы найти соответствующую строку, а затем создает копию списка, вносит изменения.данные, а затем снова устанавливает состояние.
Приложение не очень быстрое, возможно, с полсекундной задержкой, прежде чем значок изменится на моем пикселе 2, и в списке будет только 100 записей.Я немного волнуюсь, если список попадет в тысячи строк, это будет действительно плохо.
Есть ли лучший / быстрый / простой / более быстрый способ решить эту проблему?
РЕДАКТИРОВАТЬ
Это функция renderListItem, которая вызывает функцию onPress
renderListItem = ({ item }) => {
return (
<TouchableOpacity
onPress={() => this.onPressListItem(item.symbol)}
>
<View style={{flex: 1, flexDirection: 'row'}}>
<View style={{backgroundColor: 'powderblue'}}>
<Ionicons style={styles.listItemIcon} name={item.iconName} />
</View>
<View style={{backgroundColor: 'skyblue'}}>
<Text style={styles.listItem}>
{item.name.toUpperCase()} {item.symbol}
</Text>
</View>
</View>
</TouchableOpacity>
);
};
EDIT # 2 Это код FlatList.
<View style={styles.mainContainer}>
<FlatList
data={this.state.symbols}
keyExtractor= {(item, index) => item.symbol}
ItemSeparatorComponent={this.renderListSeparator}
renderItem={this.renderListItem}
/>
</View>