RecyclerView未正确复用单元格问题技术咨询
OnCreateViewHolder Invocation Behavior Let's break down what's happening here with your RecyclerView scenario—this is a super common point of confusion with how RecyclerView manages view recycling:
First, let's recap your observations:
- Your RecyclerView has a total of 16 list items
- On initial load, your screen can display ~9.5 cells, and
OnCreateViewHolderis called 10 times - When scrolling initially, the method is called 4 more times with no recycling happening
- For the final two cells,
OnCreateViewHolderisn't called at all—this is when recycling finally kicks in
Why does this happen?
First, let's confirm the official behavior you referenced: OnCreateViewHolder is typically called (number of initially visible cells + 1). That extra +1 is intentional—RecyclerView creates one extra ViewHolder in advance so it can swap it in seamlessly as you start scrolling, preventing jank. In your case, 9.5 visible cells rounds up to 10, so the initial 10 calls are exactly what's expected.
Now, the initial scroll with 4 more calls: RecyclerView only recycles ViewHolders once they've completely exited the visible screen area. When you start scrolling, the first few ViewHolders that scroll out might not be fully off-screen yet, or RecyclerView hasn't marked them as eligible for recycling. Until those ViewHolders make it into the recycling pool, RecyclerView has no choice but to create new ones—hence the extra 4 calls.
By the time you reach the final two cells, enough ViewHolders have fully scrolled out and been added to the recycling pool. Now RecyclerView can grab those idle ViewHolders, rebind them with new data via onBindViewHolder, and doesn't need to call OnCreateViewHolder anymore.
Quick note on optimization
If you want to ensure recycling kicks in as early as possible, double-check that your ViewHolder doesn't have heavy initialization logic in its constructor (move that work to onBindViewHolder if possible) and that your layout manager (e.g., LinearLayoutManager) doesn't have any unusual configuration. But to be clear—what you're seeing is normal, expected behavior for RecyclerView's recycling system.
内容的提问来源于stack exchange,提问作者F. Shahid

