如何在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);
}