編集:うわー、一日中問題を修正できませんでしたが、送信した直後に、質問に追加するコードを見つけようとして、問題を見つけて修正しました。質問を変えます。
修正:viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
新しい質問: ViewPager がタブで正しく機能しているのに、以前に表示されていたのと同じコンテンツを表示するという問題が発生しています。タブA、B、CのコンテンツがタブX、Y、Zに表示されるのですが、別のコンテンツにしたいです。すべてのタブが同じフラグメントの新しいインスタンスを使用することに注意してください。
古い質問:
TabLayout
かなりうまく機能しているように見えるサポートライブラリがあります。アプリの読み込み時に、必要なタブを読み込み、スクロールを許可し、正しいフラグメントに変更します。
私は制限下に置かれ、現在の実装を変更してタブを切り替え、ユーザーの操作に基づいて新しいタブに置き換える必要があります。私がこれをしたとき、私は問題に遭遇し始めました。
起動時 3 つのタブ (A、B、C) は、同じフラグメント (単なるリスト) の新しいインスタンスをロードするように設定されています。これらは表示され、3 つのタブはすべてスクロール可能で、正しい情報が表示されます。
ユーザー スワップ タブ インタラクション - 問題 点 3 つのタブが削除され、2 つのタブ (X、Y) に置き換えられました。それらは、上から同じ Fragment の新しいインスタンスに設定されます。それらはスクロール可能ですが、ここから問題が始まります。
- まだ 3 つのタブが表示されています (A、B、C)
- 最初の 2 つのタブ (A -> X、B -> Y) の間しかスクロールできません。
- 4 つ以上のタブ (W、X、Y、Z) を追加すると、3 つのタブが表示されますが、最後のタブにスクロールするとアプリがクラッシュします。
ユーザーがクリックすると、ライブラリの SearchView Here がアプリでいつでも発生する可能性があります。すでに表示されているタブに追加タブを追加します。これは常に機能し、上記の Fragment の新しいインスタンスを追加します。
通常の流れ: 1. SearchView をクリックすると、現在のタブの最後に新しいタブ (検索) が追加されます。以前のタブはすべて同じままです。2. SearchView を閉じると、すべてのタブが削除され、以前のタブのみが追加されます。これは期待どおりに機能します。
ユーザーがタブの交換操作を実行してから SearchView フローをクリックした場合 1. 以前のタブ (つまり、A、B、C) が削除され、新しいタブ (つまり、X、Y) に置き換えられます 2. 新しいタブが最後に追加されます新しいタブの (検索)。3. SearchView を閉じると、すべてのタブが削除され、新しいタブ (X、Y) のみが追加されます。これは期待どおりに機能します。
SearchViewをクリックした場合にのみ、タブが正しく表示されることに注意してください。そうしないと、ユーザーのスワップタブ操作で間違ったタブが表示されます。
デバッグ中に、これが発生することがわかりました。これは、SearchView をクリックしたときにのみ、何らかの形でアダプターのgetPageTitle()
メソッドがトリガーされるためです。ユーザーがスワップタブの操作を実行すると、getPageTitle()
メソッドが呼び出されず、問題が発生します。
私の唯一の問題は、この問題の解決策を見つけることができないということです。ここには同様の問題について多くの質問がありますが、どれも機能していないようです。
私が試したこと
adapter.notifyDataSetChanged();
スワップタブの相互作用の後setAdapter(null); setAdapter(adapter);
return POSITION_NONE;
forceLayout()
、invalidate()
、など...
現在は何も機能していないようですが、解決策をgetPageTitle()
呼び出す必要があるようです。そうすれば、私はうまくいくはずです。唯一の問題は、これまで毎回失敗したことです
コード
FragmentPagerAdapter
public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments = new ArrayList<>(App.getNumberOfApiCalls());
private final List<String> tabTitles = new ArrayList<>(App.getNumberOfApiCalls());
public ViewPagerFragmentAdapter(final FragmentManager manager) { super(manager); }
public void addFragment(final Fragment fragment, final Downloadable tab) {
fragments.add(fragment);
tabTitles.add(tab.toString());
}
public void clearTabs() {
fragments.clear();
tabTitles.clear();
}
@Override
public int getItemPosition(Object item) {
int index = fragments.indexOf(item);
if (index == -1) return POSITION_NONE;
return index;
}
@Override
public Fragment getItem(final int position) { return fragments.get(position); }
@Override
public int getCount() { return fragments.size(); }
@Override
public CharSequence getPageTitle(final int position) {
return tabTitles.get(position);
}
}