FlatList는 아래와 같이 필수 속성을 이용해야 한다.
-data
-renderItem
<최종 화면> - ListView - FlatList를 이용하여 데이터를 보여준다.
작업을 하기 전에 AVD를 실행시켜 놓자.
cmd창을 이용하여 작업할 경로까지 접근하여 init 하자.
임의로 보여줄 데이터를 만들고 FlatList로 화면에 보여주자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import React, {Component} from 'react';
import {View, Text, StyleSheet, FlatList} from 'react-native';
export default class Main extends Component{
// RN에서 ListView 용도의 컴포넌트
// 1. FlatList
// 2. SectionList
constructor(){
super();
// 리스트에 보여줄 대량의 데이터
datas: ["aaa","bbb","ccc","ddd"],
};
}
render(){
return(
<View style={style.root}>
<Text style={style.titleText}>FlatList Test</Text>
{/* 1. FlatList */}
{/* 2가지 필수 속성 */}
{/* 1) data - FlatList가 보여줄 대량의 데이터 */}
{/* 2) renderItem - 아이템 하나의 모양(컴포넌트)를 만들어서 리턴하는 콜백함수 지정 */}
<FlatList
data={this.state.datas }
// renderItem의 함수 파라미터에 전달된 객체는 위
</FlatList>
</View>
);
}//render method ..
}
root:{flex:1, padding:16,},
titleText:{
fontSize:24,
fontWeight:'bold',
textAlign:'center',
paddingBottom:16,
},
});
|
방금 코드를 구조분해 할당으로 바꿔서 쓸 수 있다.
위 실행 사진을 보면 경고창이 하단에 뜰 것이다. 이유는 key 속성이 없어서다. 데이터를 만들때 key값을 주겠다.
이전에 있던 FlatList는 주석처리하고 다시 만들자.
데이터를 더 많이 만들었다. ListView의 장점은 자동으로 스크롤 기능이 있다. (보여줄 데이터가 많다면 자동으로 스크롤)
클릭했을때, 해당 리스트의 데이터를 알림창에 보여주자.
그리고 코드를 좀더 간결하게 생략 가능하다.
이미지와 텍스트가 있는 새로운 대량의 데이터를 만들어서 화면에 보여주자.
RN09ListView폴더에 images 폴더를 만들고, images 폴더 안에 이미지를 추가하였다.
그 전에 있던 FlatList는 주석 처리하고 다시 만들었다.
배치한 데이터들에 스타일을 적용하자.
key property가 없어서 경고창이 나온다. 키를 추가하자.
키 추가방법 말고 다른 방법도 있다. 추출해서 사용만 하는 것이다.
단, 키 값을 alert로 보려고 해도 볼 수 없다. (key를 추가한 것이 아니므로)
keyExtractor의 내용도 좀더 간결하게 줄일 수 있다.
<복붙용 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
import React, {Component} from 'react';
import {View, Text, StyleSheet, FlatList, TouchableOpacity, TouchableWithoutFeedback, Image} from 'react-native';
export default class Main extends Component{
// RN에서 ListView 용도의 컴포넌트
// 1. FlatList
// 2. SectionList
constructor(){
super();
// 리스트에 보여줄 대량의 데이터
datas: ["aaa","bbb","ccc","ddd"],
// key 프로퍼티를 가진 대량의 데이터
datas2:[
{key:"0",data:"aaa"},
{key:"1",data:"bbb"},
{key:"2",data:"ccc"},
{key:"3",data:"ddd"},
{key:"4",data:"aaa"},
{key:"5",data:"bbb"},
{key:"6",data:"ccc"},
{key:"7",data:"ddd"},
{key:"8",data:"aaa"},
{key:"9",data:"bbb"},
{key:"10",data:"ccc"},
{key:"11",data:"ddd"},
],
// 08ListLayout2 예제 다시 만들어 보기
datas3: [
],
};
}
render(){
// 대량의 데이터의 각 아이템에 [key]라는 이름의 프로퍼티가 존재해야만 함.
// 기존의 배열 요소 객체들의 key라는 이름의 프로퍼티(멤버 변수)를 추가하기
// 배열의 요소 개수만큼 요소들을 순회하면서 파라미터로 전달된 콜백함수 호출하는 forEach()
// });
return(
<View style={style.root}>
<Text style={style.titleText}>FlatList Test</Text>
{/* 1. FlatList */}
{/* 2가지 필수 속성 */}
{/* 1) data - FlatList가 보여줄 대량의 데이터 */}
{/* 2) renderItem - 아이템 하나의 모양(컴포넌트)를 만들어서 리턴하는 콜백함수 지정 */}
{/* <FlatList
data={this.state.datas2}
// renderItem의 함수 파라미터에 전달된 객체는 위
// 그 객체의 멤버인 item, index를 구조분해 할당으로 파라미터 받기
</FlatList> */}
{/* <FlatList
data={this.state.datas2}
renderItem={({item})=>
<TouchableOpacity onPress={()=>{alert(item.data);}}>
<View style={{borderWidth:1, borderRadius:8, padding:8, margin:8}}>
<Text>{item.key}</Text>
<Text>{item.data}</Text>
</View>
</TouchableOpacity>
}>
</FlatList> */}
{/*예제 08ListLayout2 다시 만들기 */}
<FlatList
data={this.state.datas3}
renderItem={this.renderItem}
// FlatList의 속성: 각 요소에 키를 추출해주는 콜백함수 지정
keyExtractor={ item=> item.name }>
</FlatList>
</View>
);
}//render method ..
//멤버 메소드 - FlatList의 renderItem용
renderItem=({item})=>{
return(
<TouchableOpacity style={style.itemView} onPress={()=>{alert(item.name);}}>
<View style={{flexDirection:'column'}}>
<Text style={style.itemName}>{item.name}</Text>
<Text style={style.itemMsg}>{item.message}</Text>
</View>
</TouchableOpacity>
);
}
}//Main class..
root:{flex:1, padding:16,},
titleText:{
fontSize:24,
fontWeight:'bold',
textAlign:'center',
paddingBottom:16,
},
itemView:{
flexDirection:'row',
borderWidth:1,
borderRadius:4,
padding:8,
marginBottom:12,
},
itemImg:{
width:120,
height:100,
resizeMode:'cover',
marginRight:8,
},
itemName:{
fontSize:24,
fontWeight:'bold',
},
itemMsg:{
fontSize:16,
fontStyle:'italic',
},
});
|
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > HybridApp' 카테고리의 다른 글
HybridApp-React Native 2세대 (Page 전환-react_navigation, 외부 라이브러리 추가 사용) (0) | 2020.01.22 |
---|---|
HybridApp-React Native 2세대 (ListView - SectionList) (0) | 2020.01.22 |
HybridApp-React Native 2세대 (Layout 2, ListView를 안쓰고 이미지텍스트 배치) (0) | 2020.01.21 |
HybridApp-React Native 2세대 (Layout) (0) | 2020.01.21 |
HybridApp-React Native 2세대 (CustomComponent) (0) | 2020.01.21 |
댓글