1

私の問題は、新しいデータを取得したときに、カスタム アダプターを使用するビューページャーがビューを更新しないことです。多くのプログラマーが同じバグを抱えていることを発見したので、多くの提案を試みましたが、うまくいきません。すごく疲れた。もう一度、私のソースを読んで、ビューの更新に失敗した理由を理解してください。ここに私のFragmentAdapterがあります:

private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements
        SwipeyTabsAdapter {

    private final Context mContext;
    private String[] datas;

    public SwipeyTabsPagerAdapter(Context context, FragmentManager fm, String[] ds) {
        super(fm);
        this.mContext = context;
        datas=ds;
    }

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

    @Override
    public Fragment getItem(int position) {
        Log.e("new item:", datas[position]);
        return SwipeyTabFragment.newInstance(datas[position]);
    }

    @Override
    public int getCount() {
        return datas.length;
    }

    public TextView getTab(final int position, SwipeyTabs root) {
        TextView view = (TextView) LayoutInflater.from(mContext).inflate(
                R.layout.swipey_tab_indicator, root, false);
        view.setText(datas[position]);
        view.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mViewPager.setCurrentItem(position);
            }
        });

        return view;
    }

}

ここでアダプターを設定します:

SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(getApplicationContext(), getSupportFragmentManager(),dicts);
            mViewPager.setAdapter(adapter);
            mTabs.setAdapter(adapter);
            mViewPager.getAdapter().notifyDataSetChanged();

logcat を使用すると、初回のみ newItem が処理されるため、ビューを更新できないことが明確にわかります。

4

2 に答える 2

1

私もこの問題を抱えていて、インターネットで見つけたすべてのものを試してみましたが、うまくいきませんでした。

実際の解決策は、FragmentPagerAdapter の代わりに FragmentStatePagerAdapter を使用することです。FragmentPagerAdapter は「不変」のようです (少なくともそのように動作します)。

詳細については、次のスレッドを参照してください。

ViewPager を動的に更新しますか?

別の有効な解決策ですが、悪い解決策は、毎回すべて (ViewPager、Adapter) を再インスタンス化し、古いものをプログラムで削除して新しいものを追加することです。

編集

このメソッドも追加する必要があるアダプターで重要なことを忘れました:

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
于 2012-06-21T19:51:56.137 に答える
0

mTabでもnotifyDataSetChanged()を呼び出します。SwipeyTabsViewクラスでこのメソッドの実装を参照してください。

public void notifyDatasetChanged() {
    if (mPager != null && mAdapter != null) {
        initTabs();
        measure(mWidthMeasureSpec, mHeightMeasureSpec);
        calculateNewPositions(true);
    }
}
于 2012-06-21T19:45:58.550 に答える