转载地址:http://blog.csdn.net/windows771053651/article/details/51596744
功能:图片瀑布流
问题1:如何保持已显示过的imageview的尺寸
解决方法:定义一个HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用来保存已显示过的ImageView尺寸,显示时直接取其比例即可
代码:onBindItemView(),调用resizeItemView(itemViewHolder.frontCoverImage, getScaleType(position));
private float getScaleType( int position) { if (!indexMap.containsKey(position)) { float scaleType; if (hasHeader()) { if (position == 1 ) { scaleType = SIZE_SCALE_01; } else if (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; } else if (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); } private void 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" > private void 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); 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 public void 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就不会重绘