Android中Recyclerview使用13----實現瀑布流遇到的各種問題(item移動,載入更多圖片閃爍,以及定製各種型別Header和Footer)
阿新 • • 發佈:2019-01-10
功能:圖片瀑布流
問題1:如何保持已顯示過的imageview的尺寸
解決方法:定義一個HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用來儲存已顯示過的ImageView尺寸,顯示時直接取其比例即可
程式碼:onBindItemView(),呼叫resizeItemView(itemViewHolder.frontCoverImage, getScaleType(position));
-
privatefloat getScaleType(int position) {
- if (!indexMap.containsKey(position)) {
- float scaleType;
- if (hasHeader()) {
- if (position == 1) {
- scaleType = SIZE_SCALE_01;
- } elseif (position == 2) {
- scaleType = SIZE_SCALE_02;
-
} else
- scaleType = Utils.getRandomInt() % 2 == 0 ? SIZE_SCALE_01 : SIZE_SCALE_02;
- }
- } else {
- if (position == 0) {
- scaleType = SIZE_SCALE_01;
- } elseif (position == 1) {
-
scaleType = SIZE_SCALE_02;
- } else {
- scaleType = Utils.getRandomInt() % 2 == 0 ? SIZE_SCALE_01 : SIZE_SCALE_02;
- }
- }
- indexMap.put(position, scaleType);
- }
- return indexMap.get(position);
- }
- privatevoid resizeItemView(ImageView frontCoverImage, float scaleType) {
- LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();
- params.width = screenWidth / 2;
- params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);
- frontCoverImage.setLayoutParams(params);
- }<pre name="code"class="java">privatevoid resizeItemView(ImageView frontCoverImage, float scaleType) {
- LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();
- params.width = screenWidth / 2;
- params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);
- frontCoverImage.setLayoutParams(params);
- }
以上解決了滑動過程中的item移動,但是RecyclerView滑動到頂部時仍會出現移動問題,這是由於item重用,並且要保持滿屏造成的
問題2:RecyclerView滑動到頂部時仍會出現移動問題
解決方法:
- final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
- //RecyclerView滑動過程中不斷請求layout的Request,不斷調整item見的間隙,並且是在item尺寸顯示前預處理,因此解決RecyclerView滑動到頂部時仍會出現移動問題
- layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
- mRecyclerView.setLayoutManager(layoutManager);
- mRecyclerView.addItemDecoration(new DividerGridItemDecoration(getContext()));
- mRecyclerView.setPadding(0, 0, 0, 0);
- mRecyclerView.addOnScrollListener(new OnScrollListener() {
- @Override
- publicvoid onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- layoutManager.invalidateSpanAssignments();
- }
- });
以上解決了item移動的各種問題
問題3:瀑布流載入更多用notifyDataSetChanged()重新整理圖片閃爍
原因:notifyDataSetChanged()會導致整個itemview重新整理,已經測試:相同position重新整理其itemview是不同的物件,例如,重新整理後,position為12的用了position為13的itemview,再次重新整理時,又用了position為10的itemview,這樣次position上對應的itemview的ImageView就會在重設size時發生閃爍,此現象是可以用肉眼看到的。
解決方法:
用notifyItemRangeInserted()進行區域性重新整理,這樣原先的itemview就不會重繪