ViewPager显示碎片的麻烦

时间:2013-04-18 08:41:58

标签: android android-fragments android-viewpager fragmentpageradapter

我正在尝试使用ViewPager显示带有三个选项卡的片段。最初我曾经使用FragmentMgr从Activity中实例化片段,这很好用。当我使用ViewPager转换此导航时,不再显示此片段。

MainActivity.java

当我像这样启动Fragment时,会显示它。例如:

LaunchListFragment fragment = new LaunchListFragment();
fragment.newInstance(LIST_TYPE);
getSupportFragmentManager().beginTransaction()
                .add(R.id.item_detail_container,   
 fragment).commit();

我尝试在代码上面进行此更改,以便按如下方式使用ViewPager:

mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(new LaunchPageAdapter(getSupportFragmentManager(),LIST_TYPE));
mViewPager.setCurrentItem(0);

其中LaunchPageAdapter调用LaunchListFragment。

LaunchPageAdapter.java

public class LaunchPageAdapter extends FragmentPagerAdapter {
private static String select="";

    public LaunchPageAdapter(FragmentManager fm, String type) {
        super(fm);
        select=type;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return LaunchListFragment.newInstance(select);
            case 1:
                return AddTeamFragment.newInstance();

        }
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 2;
    }

这是LaunchListFragment.java

public class LaunchListFragment extends ListFragment implements ActionBar.TabListener {
public static  String LIST_TYPE = "invalid";
GenericListData g_data[] = null;


   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

         setActionTabs();
         setList();
        return (result);
    }


   public static Fragment newInstance(String type) {
    Fragment frag = new LaunchListFragment();
    Bundle args = new Bundle();
    LIST_TYPE=type;
    args.putString(LIST_TYPE, type);
    frag.setArguments(args);
    return (frag);
}

这是MainActivity使用的main.xml布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools=  "match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:baselineAligned="false"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle"
tools:context=".MainActivity" >

<fragment
    android:id="@+id/item_list"
    android:name="com.teammanager.ItemListFragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@android:layout/list_content" />

<FrameLayout
    android:id="@+id/item_detail_container"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</FrameLayout>

LaunchListFragment

使用的fragment_launch_list.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:drawSelectorOnTop="false" >
</ListView>

<TextView
    android:id="@+id/itemName"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:gravity="center_vertical"
    android:textColor="#000000"
    android:textSize="22dp"
    android:textStyle="bold" />

当我调试它时,我可以看到LaunchListFragment正在实例化,onCreate和onCreate View被调用,它不会被显示。 :(

如果我在ViewPager实现中遗漏了任何内容,那么有人可以告诉我吗?

更新

当我在不使用Viewpager的情况下调用LaunchListFragment时,我首先设置了内容视图并传递了R.id.item_detail_container,这是我想要显示片段的FrameLayout的id。请参阅前面的main.xml

 setContentView(R.layout.main.xml);
 LaunchListFragment fragment = new LaunchListFragment();
 fragment.newInstance(LIST_TYPE);
  getSupportFragmentManager().beginTransaction()
                .add(R.id.item_detail_container,    
  fragment).commit();

当我改变它以使用ViewPager时,我不确定我指示片段显示在哪里。在我的片段onView中,我正在膨胀fragment_launch_list并返回View。但是视图寻呼机将如何知道设置片段视图的位置。它在id寻呼机里面吗?

我是一个绝对的初学者,如果所有这些都是天真的问题,我道歉。

干杯。

2 个答案:

答案 0 :(得分:2)

问题描述完全适合我刚才遇到的问题。我知道这个问题已经过时了,但这可能会帮助其他人面对同样的问题@Geoplex没有显示LaunchPageAdapter类的代码。所以我不确定这是否能解决他的问题。但对我来说这很有用。

在我的PagerAdapter中, public boolean isViewFromObject(View view, Object object)被覆盖了。我删除了该方法并允许superClass处理它。这开始给出我预期的结果。

答案 1 :(得分:1)

这对你很有用,

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragments=null;
    private FragmentManager fragmentManager=null;
    public ViewPagerAdapter(FragmentManager fragmentManager,List<Fragment> fragments) {
        super(fragmentManager);
        this.fragments=fragments;
        this.fragmentManager=fragmentManager;
    }
    @Override
    public Fragment getItem(int position) {
        fragmentManager.beginTransaction().commitAllowingStateLoss();
        return fragments.get(position);
    }
    @Override
    public int getCount() {
        return fragments.size();
    }
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object)
    {
        super.setPrimaryItem(container,0,fragments.get(0));
    }
    @Override
    public void notifyDataSetChanged()
    {
        super.notifyDataSetChanged();
    }
    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        fragmentManager.executePendingTransactions();
        fragmentManager.saveFragmentInstanceState(fragments.get(position));
    }
    public void replaceItem(int position,Fragment fragment)
    {
        fragments.set(position, fragment);
        this.notifyDataSetChanged();
    }
}

MainActivity.java

public class MainActivity extends FragmentActivity implements OnPageChangeListener,TabListener
{
    private android.support.v4.view.ViewPager mViewPager=null;
    private ViewPagerAdapter mPagerAdapter=null;
    private ActionBar action=null;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        initilizeViewPager();
        action=getActionBar();
                action.setDisplayShowHomeEnabled(false);
                action.setDisplayShowTitleEnabled(false);
                action.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }
         public void initilizeViewPager()
     {
                 mViewPager=(android.support.v4.view.ViewPager)findViewById(R.id.viewPager);
         List<Fragment> fragments = new Vector<Fragment>();
                fragments.add(LaunchListFragment.newInstance(select));
                fragments.add(AddTeamFragment.newInstance());
                fragments.add(thirdFragment.newInstance());
                viewPagerAdapter=new ViewPagerAdapter();
mViewPager.setAdapter(viewPagerAdapter(getSupportFragmentManager(),fragments));
                new setAdapterTask().execute();
        mViewPager.setOnPageChangeListener(this);
     }
     private class setAdapterTask extends AsyncTask<Void,Void,Void>
     {
        protected Void doInBackground(Void... params) 
        {
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            mViewPager.setAdapter(mPagerAdapter);
            Tab first=action.newTab().setTag("first").setText("First").setTabListener(MainActivity.this);
            Tab second=action.newTab().setTag("second").setText("Second").setTabListener(MainActivity.this);
Tab third=action.newTab().setTag("third").setText("Third").setTabListener(MainActivity.this);
            action.addTab(first);
            action.addTab(second);
                    action.addTab(third);
            }
        }
     }
     public void onPageScrollStateChanged(int arg0) 
     {}
     public void onPageScrolled(int arg0, float arg1, int arg2)
     {}
     public void onPageSelected(int position) 
     {
         getActionBar().setSelectedNavigationItem(position);
     }
public void onTabReselected(Tab tab, FragmentTransaction ft) {}
     public void onTabSelected(Tab tab, FragmentTransaction ft) {
         mViewPager.setCurrentItem(tab.getPosition());
     }
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {}
}

main_layout.xml

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <android.support.v4.view.ViewPager
       android:id="@+id/viewpager"
       android:layout_width="fill_parent"
       android:layout_below="@android:id/tabs"
       android:layout_height="fill_parent"/>
</RelativeLayout>