我正在使用ViewPager
视图V1,V2,V3 .....我试图通过单击按钮来设置每个视图中使用的LinearLayout的可见性。通过此代码,它将更改应用于下一个视图而不是当前视图。例如我在V5上。当我点击它隐藏/显示V6上的对象。如果我从V6倒退到V5,那么它会在V4上应用更改。
以下是代码:
public class FragmentStatePagerSupport extends FragmentActivity {
static final int NUM_ITEMS = 10;
MyAdapter mAdapter;
ViewPager mPager;
static int mNum;
private Button btn_zoom;
static LinearLayout LL_Head;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setCurrentItem(5);
btn_zoom = (Button)findViewById(R.id.btn_zoom);
btn_zoom.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if (LL_Head.getVisibility() == View.VISIBLE) {
LL_Head.setVisibility(View.GONE);
}else{
LL_Head.setVisibility(View.VISIBLE);
}
}
});
.
.
.
}
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
}
public static class ArrayListFragment extends ListFragment {
static ArrayListFragment newInstance(int num) {
ArrayListFragment f = new ArrayListFragment();
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.sura_vpager, container, false);
TextView tv1=(TextView) v.findViewById(R.id.txtHead);
tv1.setText("Fragment #" + mNum);
LL_Head = (LinearLayout)v.findViewById(R.id.LL_Head);
return v;
}
请指教 感谢
答案 0 :(得分:3)
为了获得流畅的体验,ViewPager不仅会加载您当前正在查看的视图,还会加载相邻的视图。这意味着,如果您从位置0滚动到位置1,实际发生的是位置2被加载,因此当您滚动时它将准备就绪。这就是为什么更改应用于“下一个”视图而不是当前视图(如果从视图2滚动到1,则创建视图0)。
由于您在OnCreate中设置了静态LinearLayout,因此它只是要创建的最后一个被更改的视图 - 如果您已滚动到寻呼机的末尾,这将只是您正在查看的视图。相反,您应该跟踪用户正在查看的片段(ViewPager.setOnPageChangeListener())并将片段缓存在适配器中。然后你知道你想要哪个片段位置,当你要求它时,你将只返回你之前创建的那个(不要创建一个新的,然后它将无效:))。
或者,tl; dr版本: LL_Head几乎总是设置为下一个片段,而不是当前片段。不要静态设置它。将其缓存在PagerAdapter中,并在需要时重新设置。
编辑: 或者,您可能希望让片段听取各种事件,告诉他们是否应该显示或隐藏有问题的布局。否则它只会是受此影响的当前片段,而不是所有片段。
答案 1 :(得分:0)
Java中的编号从0开始。因此,当您要设置第5项时,必须调用mPager.setCurrentItem(4);
希望这有帮助!