Recycler view

Recycler view

์ƒ์„ฑ์ผ
2024๋…„ 07์›” 16์ผ
ํƒœ๊ทธ
์•ˆ๋“œ๋กœ์ด๋“œ์˜ Recycler view

RecyclerView์˜ ์ž‘๋™ ์›๋ฆฌ

RecyclerView๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ViewHolder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ ๋ทฐ์˜ ์žฌํ™œ์šฉ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํฌ๋กค ์‹œ ๊ธฐ์กด์˜ ๋ทฐ๋ฅผ ์žฌํ™œ์šฉํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด ํ•ด๋‹น ๋ทฐ๋ฅผ ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์— ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ย 
ย 
ย 
import React from 'react'; import {FixedSizeList as List} from 'react-window'; interface Base { id?: string | number; } interface Props<T> { itemCount: number; itemSize: number; items: (T & Base)[]; renderItem: (item: T, index: number) => React.ReactNode; keyExtractor?: (item: T) => string; initialNumToRender?: number; } function RecyclerView<T>({ itemCount, items, renderItem, keyExtractor, initialNumToRender, itemSize, }: Props<T>) { return ( <List height={itemSize * ((initialNumToRender || itemCount) - 1)} overscanCount={0} itemCount={itemCount} itemSize={itemSize} width='100%' > {({index, style}) => { const item = items[index]; return ( <div style={style} key={keyExtractor ? keyExtractor(item) : item.id}> {renderItem(item, index)} </div> ); }} </List> ); } export default RecyclerView;
ย 
์œ„ ์ฝ”๋“œ๋Š” reactwindow ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•œ ๋ชจ์Šต.
List ์ปดํฌ๋„ŒํŠธ๋ฅผ wrappingํ–ˆ๋Š”๋ฐ
๋ฐ˜๋ณต์ ์ธ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๋žœ๋”๋งํ•ด์„œ ๋ฆฌํ„ดํ•˜๋Š” ๋ถ€๋ถ„์ด ์ธ์ƒ์ ์ž„.
๋˜ List๋ฅผ ์‚ฌ์šฉํ•ด map์„ ์‚ฌ์šฉ์•ˆํ•˜๊ณ ๋„ ๋ฐฐ์—ด ๋žœ๋”๋งํ•จ.
์žฌ์‚ฌ์šฉ์„ฑ์ด ์ง„์งœ ๋†’์•„๋ณด์ธ๋‹ค.
ย 
์•„๋ž˜๋Š” ํ™œ์šฉ.
import React, {useEffect, useState} from 'react'; import RecyclerView from "./RecyclerView"; interface Source { id?: string; name: string; } interface Feed { author?: string; content: string; description: string; publishedAt: string; source: Source; title: string; url: string; urlToImage?: string; } type Feeds = Feed[]; const NewsFeed: React.FC = () => { const [feeds, setFeeds] = useState<Feeds>([]); useEffect(() => { // Example of fetching data from an API endpoint fetch('https://newsapi.org/v2/top-headlines?country=us', { headers: { "X-Api-Key": "9f6482a584804376874b848980b7a044" } }) .then(response => response.json()) .then(data => { setFeeds(data.articles); }); }, []); return ( <div className="news-feed-container"> {feeds.length === 0 ? ( <p>Loading...</p> ) : ( <RecyclerView initialNumToRender={3} keyExtractor={(item) => item.title} itemCount={feeds.length} items={feeds} itemSize={300} renderItem={(feed,) => ( <div key={feed.url} className="news-feed-item"> <h2>{feed.title}</h2> <p><strong>Author:</strong> {feed.author || 'Unknown'}</p> <p><strong>Source:</strong> {feed.source.name}</p> <p>{feed.description}</p> <p>{feed.content}</p> <a href={feed.url} target="_blank" rel="noopener noreferrer">Read more</a> <img src={feed.urlToImage} alt={feed.title}/> <p><strong>Published At:</strong> {new Date(feed.publishedAt).toLocaleString()}</p> </div> ) }/> )} </div> ); } export default NewsFeed;
ย 
ย 
react window๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์ด์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๋žœ๋”๋ง ํ•˜์ง€ ์•Š๊ธฐ
ย 
โ€ฃ
ย