【问题标题】:items in GridLayoutManager (RecyclerView) changes position on scroll androidGridLayoutManager(RecyclerView)中的项目在滚动android上更改位置
【发布时间】:2016-02-17 08:16:15
【问题描述】:

我有什么

我有一个GridLayoutManager (RecyclerView),它的位置 0,2,5,7 用自定义图像固定(相对布局转换为位图),其余位置用服务器图像填充

我的问题

当我滚动布局中的项目时,它的位置会改变

我的代码

@Override
    public void onBindViewHolder(ProfilePhotosViewHolder ProfilePhotosViewHolder, final int position) {
        model = list.get(position);

        if (position == 0 || position == 2 || position == 5 || position == 7) {
            if (position == 0) {
                ProfilePhotosViewHolder.relativeBucket.setVisibility(View.VISIBLE);
                ProfilePhotosViewHolder.relativeBucket.setDrawingCacheEnabled(true);
                ProfilePhotosViewHolder.relativeBucket.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                ProfilePhotosViewHolder.relativeBucket.layout(0, 0, ProfilePhotosViewHolder.relativeBucket.getMeasuredWidth(), ProfilePhotosViewHolder.relativeBucket.getMeasuredHeight());
                ProfilePhotosViewHolder.relativeBucket.buildDrawingCache(true);
                Bitmap b = Bitmap.createBitmap(ProfilePhotosViewHolder.relativeBucket.getDrawingCache());
                ProfilePhotosViewHolder.relativeBucket.setDrawingCacheEnabled(false);
                ProfilePhotosViewHolder.imgProfilePhotos.setImageBitmap(b);
            }

            if (position == 2) {
                ProfilePhotosViewHolder.relativeFollowers.setVisibility(View.VISIBLE);
                ......

            }

            if (position == 5) {
                ProfilePhotosViewHolder.relativeFollowing.setVisibility(View.VISIBLE);
               ......
            }

            if (position == 7) {
                ProfilePhotosViewHolder.relativePosts.setVisibility(View.VISIBLE);
                ......
            }

        } else {

            ProfilePhotosViewHolder.relativeBucket.setVisibility(View.GONE);
            ProfilePhotosViewHolder.relativeFollowers.setVisibility(View.GONE);
            ProfilePhotosViewHolder.relativeFollowing.setVisibility(View.GONE);
            ProfilePhotosViewHolder.relativePosts.setVisibility(View.GONE);

            ImageLoader imageLoader = AppController.getInstance().getImageLoader();
            ProfilePhotosViewHolder.imgProfilePhotos.setImageUrl(model.ImagesUri, imageLoader);
            ProfilePhotosViewHolder.imgProfilePhotos.setDefaultImageResId(R.drawable.im_profile_monuments);
            ProfilePhotosViewHolder.imgProfilePhotos.setErrorImageResId(R.drawable.im_profile_monuments);
        }

屏幕截图

滚动后

【问题讨论】:

    标签: android scroll android-recyclerview gridlayoutmanager


    【解决方案1】:

    这是因为回收机制,当你在玩可见性时,你还需要在每个if 块中处理其他Views 的可见性。

    例如位置 2:

    if (position == 2) {
    
        ProfilePhotosViewHolder.relativeFollowers.setVisibility(View.VISIBLE);
    
        ProfilePhotosViewHolder.relativeBucket.setVisibility(View.GONE);
        ProfilePhotosViewHolder.relativeFollowing.setVisibility(View.GONE);
        ProfilePhotosViewHolder.relativePosts.setVisibility(View.GONE);
    }
    

    PS:我建议你使用switch(position) 而不是嵌套的if 块。

    【讨论】:

    • 在我的情况下切换有什么好处?
    • @karthikkolanji:请参阅:stackoverflow.com/questions/767821/…。这是关于它是如何在内部实现的。是的,为更漂亮的代码 +1 :)
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多