如何在Fragment-Android中从LinearLayoutManager更改为StaggedGridLayoutManager

如何在Fragment-Android中从LinearLayoutManager更改为StaggedGridLayoutManager,android,android-layout,android-fragments,android-linearlayout,android-gridlayout,Android,Android Layout,Android Fragments,Android Linearlayout,Android Gridlayout,在我的片段中,我在RecyclerView中有staggedGridLayoutManager和LinearLayoutManager。当我从设置中选择模式时,我试图将布局从网格更改为线性,或从线性更改为网格。如果选择grid,视图将从linear更改为staggedGridLayoutManager。如果我选择linear视图将从grid更改为linear 以下是我的onCreateView和onOptions ItemSelected功能: public class NewsFragment

在我的
片段
中,我在
RecyclerView
中有
staggedGridLayoutManager
LinearLayoutManager
。当我从设置中选择模式时,我试图将布局从
网格
更改为
线性
,或从
线性
更改为
网格
。如果选择
grid
,视图将从
linear
更改为
staggedGridLayoutManager
。如果我选择
linear
视图将从
grid
更改为
linear

以下是我的
onCreateView
onOptions ItemSelected
功能:

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);
    }
}
公共类新闻片段扩展片段{
private int previousTotal=0;
私有布尔加载=真;
私有int visibleThreshold=5;
int firstVisibleItem、visibleItemCount、totalItemCount;
int模式=1;
图像加载器;
显示图像选项;
回收器适配器;
ProgressBar ProgressBar;
视图根视图;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
新建JSONGetNews().execute();
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
rootView=充气机。充气(R.layout.fragment\u news,container,false);
最终LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getActivity());
最终StaggedGridLayoutManager gridLayoutManager=新的StaggedGridLayoutManager(2,StaggedGridLayoutManager.VERTICAL);
RecyclerView RecyclerView=(RecyclerView)rootView.findViewById(R.id.RecyclerView);
addItemDecoration(新的DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL_LIST));
开关(模式){
案例0:
recyclerView.setLayoutManager(linearLayoutManager);
打破
案例1:
setLayoutManager(gridLayoutManager);
打破
}
mAdapter=new RecyclerAdapter(getActivity(),itemsData);
recyclerView.setAdapter(mAdapter);
setItemAnimator(新的DefaultItemAnimator());
progressBar=(progressBar)rootView.findviewbyd(R.id.progressBar);
recyclerView.setOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
开关(模式){
案例0:
visibleItemCount=linearLayoutManager.getChildCount();
totalItemCount=linearLayoutManager.getItemCount();
firstVisibleItem=linearLayoutManager.findFirstVisibleItemPosition();
打破
案例1:
visibleItemCount=gridLayoutManager.getChildCount();
totalItemCount=gridLayoutManager.getItemCount();
progressBar.setVisibility(View.INVISIBLE);
打破
}
如果(装载){
如果(totalItemCount>previousTotal){
加载=假;
previousTotal=totalItemCount;
progressBar.setVisibility(View.VISIBLE);
}
}
如果(!loading&&(totalItemCount-visibleItemCount)

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

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);
}