StaggeredGridView 在滚动时更改项目大小

Vee*_*eru 5 java android staggered-gridview android-recyclerview

我遇到了这个问题

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

在此输入图像描述

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

在此输入图像描述

又卷了几卷,最后就变成这样了

在此输入图像描述 我不知道为什么,而且它非常随机。我尝试在每次显示页面时执行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");

    }

}
Run Code Online (Sandbox Code Playgroud)

如果需要的话我也可以发布适配器。任何建议都将受到高度赞赏。

适配器代码在这里(不想让帖子变得混乱)http://pastebin.com/QkZbjjp1

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

Vee*_*eru 1

正如杰森在评论中提到的,这是 itemgetviewtype 中的一个错误,逻辑错误比其他任何错误都重要。但吸取了教训, getItemViewType 的更新代码是

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

谢谢大家指出。