1

を使用するのViewPagerは初めてですが、アプリの最初の画面はListView、ユーザーが新しいアイテムを追加/削除できる であり、アイテムの 1 つをクリックすると、渡された ID に基づいて「詳細」フラグメントが表示されます。ユーザーがリストから各詳細までスワイプできるようにしたいと思います。

ViewPagerIDが常に1つずれていることを除いて、私は機能しています。これは私の理解不足かもしれませんが、details フラグメントの にViewPagersブレークonCreateViewポイントを設定すると、アプリのロード時にブレークポイントがヒットし、渡される id が最初の id になります。したがって、ID が 1、2、3、4 の場合、アプリが読み込まれると、アプリの起動時の IDonCreateViewは 1 になります。リストから最初の詳細フラグメントへの最初のスワイプを実行すると、ID は 2 (私はそれが1であると予想するとき)。

これは私がこれまでに持っているものです:

Main.class (アプリ起動時のこの初期アクティビティ)

public class Main extends SherlockFragmentActivity
{
    private static int NUMBER_OF_PAGES;  
    private ViewPager mViewPager;  
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments;

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

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager);  
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        final List<Integer> ids = GetIds(); //loads ids to popular the viewpager

        NUMBER_OF_PAGES = ids.size();

        fragments = new ArrayList<Fragment>();

        fragments.add(new ListingFragment()); //initial screen

        for(Integer id : ids)
            fragments.add(DetailsFragment.newInstance(id));
    }

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {            

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

        @Override  
        public Fragment getItem(int index) {

            return fragments.get(index);
        }

        @Override  
        public int getCount() {  

             return NUMBER_OF_PAGES;  
        }
   }
}

DetailsFragment.class

public class DetailsFragment extends SherlockFragmentActivity
{
    private int detailId;
    private List<Integer> items;

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

    @Override
    public void onActivityCreated(final Bundle icicle)
    {    
        super.onActivityCreated(icicle);
    }

    public static DetailsFragment newInstance(int id) {

        DetailsFragment lf = new DetailsFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        lf.setArguments(bundle);
        return lf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.details, container, false);

        detailId = getArguments().getInt("id"); //this id is always off

        items = GetItems();

        return view;
    }
}
4

1 に答える 1

0

IDが常に1つずれていることを除いて、ViewPagerが機能しています。ViewPagers の私の理解不足かもしれませんが、details フラグメントの onCreateView にブレークポイントを設定すると、アプリの読み込み時にブレークポイントにヒットし、渡される ID が最初の ID になります。したがって、ID が 1,2,3,4 であるとします。アプリが読み込まれると、onCreateView のアプリ起動時の ID は 1 です。リストから最初の詳細フラグメントへの最初のスワイプを実行すると、ID は 2 です。 (1になると予想される場合)。

たぶん私はあなたが直面している問題を理解していませんが、あなたが投稿したコードは(繰り返しますが、それがあなたが使用する完全なコードである場合(現在、あなたのDetailsFragments拡張としてコンパイルされませんSherlockFragmentActivity(?!))))あなたの言うことを実行できません. フラグメントをセットアップする方法により、フラグメントが適切な ID を持つようになります。

あなたが見ているのはViewPager、誤解を招く可能性のある動作方法による可能性が最も高いです. アプリを初めて起動すると、ListingFragment. 現在、 はViewPager、ユーザーにスムーズなスワイプを提供するために、(デフォルトで) 現在表示されているフラグメントの両側に 1 つの追加フラグメントもロードします (そのため、アプリが起動すると、ViewPagerページ0( ListingFragment) と次の ( left)) page, 1( DetailsFragmentid の1)。からListingFragment最初のDetailsFragment( idを持つ) にスワイプすると、事前に 2 番目( id を持つ1)ViewPagerが自動的に作成されます(これも、すぐにスワイプできるようにするためです)。今、あなたが持っているならDetailsFragment2Logのステートメント( を表示するには)onCreateViewから最初のidにスワイプすると 2 番目の id が表示されるのは正常です。 2 つ目(id 付き) は事前に作成されています。DetailsFragmentidListingFragmentDetailsFragmentLogDetailsFragment1DetailsFragment2

また、微妙なバグを導入したため、コードを修正してください。NUMBER_OF_PAGESで初期化されるアダプタのサイズを設定し ますが、最後に id(from ) を持つ がまったく表示されないようにするをids.size()追加します。ListingFragmentDetailsFragmentids

于 2013-01-19T08:27:51.987 に答える