【问题标题】:StaggeredGridView changing item sizes on scrollStaggeredGridView 在滚动时更改项目大小
【发布时间】:2016-01-11 08:14:38
【问题描述】:

我遇到了这个问题

我使用的是交错的网格视图,它有两列和单列的组合......像这样的东西

一切正常,直到我上下滚动几次,它随机变成这样的东西

再画几卷,​​就这样结束了

我不知道为什么,而且非常随机。每次显示页面时,我都尝试执行 notifyDataSetChanged,但似乎什么也没做

这是我的仪表板的代码

public class DashboardStaggered extends Fragment {
    RecyclerView mRecyclerView;
    View v;
    MasonryAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("MASONRY", "onCreateView");
        super.onCreate(savedInstanceState);
        if(v==null) {
            Log.d("MASONRY", "v is NULL recreating");
            v = inflater.inflate(R.layout.activity_dashboard_staggered, container, false);
            setupRecyclerView();
        }else{
            Log.d("MASONRY", "v is NOT NULL");

        }

        return v;
    }

    private void setupRecyclerView(){
        mRecyclerView = (RecyclerView) v.findViewById(R.id.masonry_grid);
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        adapter = new MasonryAdapter(getActivity(),this);
        mRecyclerView.setAdapter(adapter);
        SpacesItemDecoration decoration = new SpacesItemDecoration(12);
        mRecyclerView.addItemDecoration(decoration);
        adapter.notifyDataSetChanged();

    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("MASONRY", "onResume");
        if(mRecyclerView==null) {
            setupRecyclerView();
        }



    }
    @Override
    public void onPause() {
        super.onPause();
        Log.d("MASONRY", "onPause");

    }

}

如果需要,我也可以发布适配器。任何建议都非常感谢大家。

适配器代码在这里(不想让帖子乱七八糟)http://pastebin.com/QkZbjjp1

修剪后的代码http://pastebin.com/Hgsji1RG

【问题讨论】:

  • 请显示您的适配器代码。如果您正在执行任何可能是罪魁祸首的后台操作。
  • 加到帖子Jason,请看
  • 我不知道这是否是问题所在,但一个潜在的原因是在第 77 行,您应该使用 getItemViewType 方法,因为这是定义视图类型的方法。
  • 正如 Jason 的评论中提到的,我也认为问题出在您的 getItemViewType() 方法中。您没有根据位置处理 ViewType,您只是更改第一个(位置 0)和最后一个(位置 11)的类型,但对于其余位置,您使用的是相同的类型 @ 987654332@.
  • 你错过了每个项目的行和列

标签: java android android-recyclerview staggered-gridview


【解决方案1】:

正如 jason 在 cmets 中提到的,这是 itemgetviewtype 的一个错误,逻辑错误比其他任何事情都多。但是吸取教训,getItemViewType 的更新代码是

@Override
    public int getItemViewType(int position) {
        // Return type based on position
        return tileDefinitions.get(position).getTileType();
    }

感谢大家指出。

【讨论】:

    【解决方案2】:

    发生这种情况是因为当您上下滚动时,支架无法识别图像视图的宽度和高度。当您向下滚动时,它会清除上视图,反之亦然。

    这样使用:

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
    
        MyViewHolder vh = (MyViewHolder) viewHolder;
        ImageModel item = imageModels.get(position);
        RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) vh.imageView.getLayoutParams();
        float ratio = item.getHeight() / item.getWidth();
        rlp.height = (int) (rlp.width * ratio);
        vh.imageView.setLayoutParams(rlp);
        vh.positionTextView.setText("pos: " + position);
        vh.imageView.setRatio(item.getRatio());
        Picasso.with(mContext).load(item.getUrl()).placeholder(PlaceHolderDrawableHelper.getBackgroundDrawable(position)).into(vh.imageView);
    }
    

    要清楚,请参阅此链接: Picasso/Glide-RecyclerView-StaggeredGridLayoutManager

    【讨论】:

      【解决方案3】:

      您好,您可以在下面找到此答案,它可能对您有所帮助。使用下面的库,

      flutter_staggered_grid_view:^0.3.2

      使用下面的输入列表:

      const List mylist = [  
        {"img": "assets/images/img_1.png", "title": "Logan"},  
        {"img": "assets/images/img_2.png", "title": "Candyman"},  
        {"img": "assets/images/img_3.png", "title": "Angry Birds"},  
        {"img": "assets/images/img_4.png", "title": "Rocket Life"},  
      ]
      
      Container(
                height: MediaQuery.of(context).size.height *0.8,
                // child: Text("data"),
                child: StaggeredGridView.countBuilder(
                  crossAxisCount: 2,
                  itemCount: SearchVideoList.length,
                  itemBuilder: (BuildContext context, int index) => new Container(
                      color: Colors.transparent,
                      child: new Center(
                        child: InkWell(
                          onTap: () {},
                          child: Container(
                            margin: EdgeInsets.all(5),
                            decoration: BoxDecoration(
                                border: Border.all(
                                    color: Colors.white.withOpacity(0.5)),
                                borderRadius: BorderRadius.circular(15),
                                image: DecorationImage(
                                  image:
                                      AssetImage(SearchVideoList[index]['img']),
                                  fit: BoxFit.cover,
                                )),
                          ),
                        ),
                      )),
                  staggeredTileBuilder: (int index) => new StaggeredTile.count(
                      index == 3 ? 2 : 1,
                      index == 0
                          ? 2
                          : index == 1
                              ? 1
                              : index == 2
                                  ? 1
                                  : 1),
                  mainAxisSpacing: 4.0,
                  crossAxisSpacing: 4.0,
                ),
              ),
      

      **示例输出:**

      【讨论】:

        【解决方案4】:

        如果你使用 Glide 加载图片,添加 dontransform() 函数并在图片视图中设置 adjustviewbound 为 true。

        例如:

        Glide.with(context).load(image.getImageUrl())
                        .placeholder(R.drawable.placeholder)
                        .dontTransform()
                        .into(holder.image);
        

        在布局文件中:

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/avatar"
                android:adjustViewBounds="true" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-15
          • 2019-09-29
          • 2022-01-01
          • 1970-01-01
          • 2021-01-03
          相关资源
          最近更新 更多