Java ViewPager中相同片段的多个实例

Java ViewPager中相同片段的多个实例,java,android,listview,android-fragments,android-viewpager,Java,Android,Listview,Android Fragments,Android Viewpager,在一个Viewpager中实现了同一片段的多个实例(根据数据动态加载)后,我遇到了一些奇怪的问题。 我的fragment类由一个listview组成,该listview将根据从服务器检索到的数据进行填充,但每次我从一个页面滑动到另一个页面时,片段的listview中的数据都是混乱的。 这是代码。任何帮助都将不胜感激。多谢各位 这是Viewpager所在的片段类 public class Menu extends Fragment implements View.OnClickListener {

在一个Viewpager中实现了同一片段的多个实例(根据数据动态加载)后,我遇到了一些奇怪的问题。 我的fragment类由一个listview组成,该listview将根据从服务器检索到的数据进行填充,但每次我从一个页面滑动到另一个页面时,片段的listview中的数据都是混乱的。 这是代码。任何帮助都将不胜感激。多谢各位

这是Viewpager所在的片段类

public class Menu extends Fragment implements View.OnClickListener {

private SlidingTabLayout mSlidingTab;
SlidingUpPanelLayout mLayout;

private ArrayList<String> menu_names;
private ViewPager pager;

ActionBarActivity act;
public ArrayList<ArrayList<All_Data>> menus;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.main, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {


    mSlidingTab = (SlidingTabLayout) act.findViewById(R.id.sliding_tab);
    mSlidingTab.setDistributeEvenly(true);
    mSlidingTab.setCustomTabView(R.layout.custom_text, 0);
    pager= (ViewPager) act.findViewById(R.id.pager);

    mSlidingTab.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
        @Override
        public int getIndicatorColor(int position) {
            return android.R.color.transparent;
        }
    });
    mSlidingTab.bringToFront();
    menuUpdate();
}


class MyPagerAdapter extends FragmentStatePagerAdapter {

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return Meals.newInstance(position);
    }

    @Override
    public int getCount() {
        return menu_names.size();
    }

    @Override
    public CharSequence getPageTitle(int i) {
        return menu_names.get(i);
    }
}


private void menuUpdate(String result) {
    //menu_names= List Retrieved from server
    //menus= List Retrieved from server
    pager.setAdapter(new MyPagerAdapter(act.getSupportFragmentManager()));
    mSlidingTab.setViewPager(pager);
}
public类菜单扩展片段实现View.OnClickListener{
私人滑动布局mSlidingTab;
滑动式平面布置图;
私有数组列表菜单名称;
私人寻呼机;
行动法;
公共数组列表菜单;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(右布局主,容器,假);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
mSlidingTab=(SlidingTabLayout)act.findViewById(R.id.sliding_选项卡);
mSlidingTab.setDistributeEvenly(真);
mSlidingTab.setCustomTabView(R.layout.custom_text,0);
pager=(ViewPager)act.findviewbyd(R.id.pager);
mSlidingTab.setCustomTabColorizer(新的SlidingTabLayout.TabColorizer()){
@凌驾
公共内部getIndicatorColor(内部位置){
返回android.R.color.transparent;
}
});
mSlidingTab.bringToFront();
menuUpdate();
}
类MyPagerAdapter扩展了FragmentStatePagerAdapter{
公共MyPagerAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
公共片段getItem(int位置){
返回膳食。newInstance(位置);
}
@凌驾
public int getCount(){
返回菜单_name.size();
}
@凌驾
公共字符序列getPageTitle(int i){
返回菜单名称。获取(i);
}
}
私有void菜单更新(字符串结果){
//菜单\名称=从服务器检索到的列表
//菜单=从服务器检索到的列表
setAdapter(新的MyPagerAdapter(act.getSupportFragmentManager());
mSlidingTab.setViewPager(寻呼机);
}
java(片段类):

公共类{
活动性活动;
int位置=0;
静态实例(int页){
膳食碎片优先=新膳食();
Bundle args=新Bundle();
参数输入(“位置”,第页);
fragmentFirst.setArguments(args);
首先返回碎片;
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(右布局、食物、容器、假);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
position=getArguments().getInt(“position”);
ArrayList mMeals;
片段菜单=activity.getSupportFragmentManager().findFragmentByTag(“菜单”);
mMeals=((菜单)菜单).menus.valueAt(位置);
ListView mList=(ListView)activity.findViewById(R.id.mainMenu1);
充气机;
充气器=LayoutInflater.from(activity.getApplicationContext());
mList.addHeaderView(充气器.充气(R.layout.custom_text,mList,false));
mList.addFooterView(充气器.充气(R.layout.footer,mList,false));
菜单适配器=新菜单适配器(((菜单)菜单)、mMeals、活动);
mList.setAdapter(适配器);
}
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
活动=(ActionBarActivity)上下文;
}
@凌驾
恢复时公开作废(){
super.onResume();
MyApplication.getInstance().trackScreenView(“启动屏幕”);
}
}
finds.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f1f2f3"

    android:orientation="vertical">

    <ListView
        android:id="@+id/mainMenu1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#f1f2f3"
        android:dividerHeight="20dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:scrollbars="none" />


</RelativeLayout>


它将返回在拥有它的活动上创建的菜单片段对象。我正在使用它引用该片段中的菜单对象。由于您多次实例化同一片段,您需要确保每个实例都知道它自己的列表,或者每次重新创建片段时它都会更改。片段将在g它的列表,因为它是从存储类对象列表的Arraylist中检索的。.每次在ActivityCreated上重新创建片段时,都会再次运行所有内容,因为Arraylist不是静态的(并且不应该是静态的,因为您多次实例化该片段)您的值也将被更新,这将返回在拥有它的活动上创建的菜单片段对象。我正在使用它引用该片段中的菜单对象。由于您多次实例化同一片段,您需要确保每个实例都知道它自己的列表,否则每次重新创建该片段时它都会更改ed.Fragment将知道它的列表,因为它是从存储类对象列表的Arraylist中检索的。.每次在ActivityCreated上重新创建片段时,都将再次运行所有操作,并且由于Arraylist不是静态的(并且不应该是静态的,因为您多次实例化该片段),因此您的值也将更新
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f1f2f3"

    android:orientation="vertical">

    <ListView
        android:id="@+id/mainMenu1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#f1f2f3"
        android:dividerHeight="20dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:scrollbars="none" />


</RelativeLayout>