首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从LinearLayoutManager变成StaggeredGridLayoutManager片段--Android

如何从LinearLayoutManager变成StaggeredGridLayoutManager片段--Android
EN

Stack Overflow用户
提问于 2015-05-23 22:03:43
回答 1查看 4K关注 0票数 1

我有StaggeredGridLayoutManagerLinearLayoutManagerRecyclerView在我的Fragment。当我从设置中选择模式时,我试图将布局从grid更改为linear或从linear更改为grid。如果选择grid,视图将从linear更改为StaggeredGridLayoutManager。如果选择linear,视图将从grid更改为linear

下面是我的onCreateViewonOptionsItemSelected函数:

代码语言:javascript
复制
public class NewsFragment extends Fragment{     

    private int previousTotal = 0;
    private boolean loading = true;
    private int visibleThreshold = 5;
    int firstVisibleItem, visibleItemCount, totalItemCount;
    int mode=1;

    ImageLoader imageLoader;
    DisplayImageOptions options;
    RecyclerAdapter mAdapter;
    ProgressBar progressBar;
    View rootView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        new JSONGetNews().execute();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_news, container, false);
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        final StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

        switch (mode) {
            case 0:
                recyclerView.setLayoutManager(linearLayoutManager);
                break;
            case 1:
                recyclerView.setLayoutManager(gridLayoutManager);
                break; 
        }

        mAdapter = new RecyclerAdapter(getActivity(),itemsData);
        recyclerView.setAdapter(mAdapter);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);

        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                super.onScrolled(recyclerView, dx, dy);
                switch (mode){
                    case 0:
                        visibleItemCount = linearLayoutManager.getChildCount();
                        totalItemCount = linearLayoutManager.getItemCount();
                        firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                        break;
                    case 1:
                        visibleItemCount = gridLayoutManager.getChildCount();
                        totalItemCount = gridLayoutManager.getItemCount();
                        progressBar.setVisibility(View.INVISIBLE);
                        break;
                }

                if (loading) {
                    if (totalItemCount > previousTotal) {
                        loading = false;
                        previousTotal = totalItemCount;
                        progressBar.setVisibility(View.VISIBLE);
                    }
                }
                if (!loading && (totalItemCount - visibleItemCount)
                <= (firstVisibleItem + visibleThreshold)) {

                    first=first+4;
                    last=last+4;

                    new JSONGetNews().execute();
                    progressBar.setVisibility(View.GONE);
                    loading = true;
                }
            }
        });

        imageLoader = ImageLoader.getInstance();
        imageLoader.init(ImageLoaderConfiguration.createDefault(getActivity()));

        options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.uranus)
        .showImageForEmptyUri(R.drawable.earth)
        .cacheOnDisc()
        .cacheInMemory()
        .build();


        return rootView;
    }



    public boolean onOptionsItemSelected(MenuItem item) {

        if(item.getItemId() == R.id.grid_view){
            mode=1; 
        }

        if(item.getItemId() == R.id.linear_view){
            mode=0; 
        }

        return super.onOptionsItemSelected(item);
    }
}

I正在将模式从1更改为0或从0更改为1,但视图没有更改。如何将布局更改为另一个布局?

谢谢你帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-23 23:21:13

您只是在更改变量中的整数值。没有人调用onCreateView (这是正确的),更重要的是,没有人在设置不同的布局管理器。以下内容将对您有所帮助(只要稍作改动):

代码语言:javascript
复制
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId() == R.id.grid_view) {
        if (mRecyclerView.getLayoutManager() == mGridLayoutManger) return true; // nothing to do
        mRecyclerView.setAdapter(null); // clear recycler view before tampering with its layout manager
        mRecyclerView.setLayoutManager(mGridLayoutManager); // set appropriate layout manager
        mRecyclerView.setAdapter(mAdapter); // reattach adapter
        return true;
    }

    if(item.getItemId() == R.id.linear_view) {
        // ditto with mLinearLayoutManager
        return true;
    }

    return super.onOptionsItemSelected(item);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30418028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档