1

Androidアプリケーションでフラグメントを使用してviewPagerを構築しているときに、非常に奇妙な問題に直面しています。レイアウトと 2 つのフラグメントを構築するアクティビティがあります。それぞれに RecyclerView が含まれており、そのコンテンツをサーバーから動的にロードします。フラグメントの静的コンテンツでテストしたところ、すべてうまく機能しましたが、テスト済みで機能している動的コンテンツ フラグメントに切り替えると、ViewPager は最初のフラグメントをロードせず、2 番目のフラグメントのみをロードします。それらを入れ替えても、viewPager は 2 番目のものだけをロードします。最初のタブには、常に白い空白のフィールドしか表示されません。どんな助けでも大歓迎です。

活動部分:

    tabLayout = (TabLayout) findViewById(R.id.contacts_tabs_layout);
    adapter = new ContactsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);

アクティビティのレイアウト:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_parent"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize" />

    <android.support.design.widget.TabLayout
        android:id="@+id/contacts_tabs_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMaxWidth="0dp"
        app:tabGravity="fill"
        app:tabMode="scrollable">

    </android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/view_pager_contacts_list"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

フラグメントのレイアウト:

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/contacts_list" android:layout_width="fill_parent" android:layout_height="match_parent" />

フラグメントの関連コード:

 contactsList = (RecyclerView) v.findViewById(R.id.contacts_list);
    contactsList.setLayoutManager(new LinearLayoutManager(getActivity()));
    adapter = new ContactsListAdapter(getActivity());
    contactsList.setAdapter(adapter);


    controller.getContacts(new CommunicationListener() {
        @Override
        public void onFileReceived(FilePath filePath, byte[] data) {
            System.out.println("RECEIVED CONTACTS DATA FILE WITH SIZE OF " + data.length);
            final Contact c = Utils.deserializeContact(data);

            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    adapter.add(c);
                }
            });
        }
    });
    return v;

アダプターの部分:

 public ContactsPagerAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);

}


@Override
public Fragment getItem(int position)
{
    switch(position){
        case 0:
            return new ContactsListFragment();
        case 1:
            return new TestFragment();
        default:
            return null;
    }
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

@Override
public int getCount() {
    return 2;
}
4

1 に答える 1

1
@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

のjavadocからPagerAdapter POSITION_NONE、アイテムが存在しなくなったことを意味します。

/** * ホスト ビューが項目の位置が変更されたかどうかを判断しようとしているときに呼び出されます。指定されたアイテムの位置が * 変更されていない場合は {@link #POSITION_UNCHANGED} を返し、 * アイテムがアダプターに存在しなくなっている場合は {@link #POSITION_NONE} を返します。* *

デフォルトの実装では、項目の位置が * 変わらないと想定され、常に {@link #POSITION_UNCHANGED} が返されます。* * @param object {@link #instantiateItem(View, int)} への呼び出しによって以前に返されたアイテムを表すオブジェクト * *。* [0, {@link #getCount()}) からの @return オブジェクトの新しい位置インデックス、 * オブジェクトの位置が変更されていない場合は {@link #POSITION_UNCHANGED}、 * アイテムが変更されていない場合は {@link #POSITION_NONE}現在。*/

アイテムまたはの位置を返す必要がありますPOSITION_UNCHANGED

また:

`PagerAdapter` はデータ セットの変更をサポートします。データ セットの変更は * 「メイン スレッド」で発生し、{@link #notifyDataSetChanged()} の呼び出しで終了する必要があります * {@link android.widget.BaseAdapter} から派生した AdapterView アダプターと同様です。データ * セットの変更には、ページの追加、削除、または位置の変更が含まれる場合があります。* ViewPager は、アダプターがメソッド {@link #getItemPosition(Object)} を * 実装している場合、現在のページをアクティブに保ちます。

notifyDatasetChanged()フラグメントを追加した後に呼び出す必要があります。

于 2015-12-28T16:34:43.490 に答える