0

そのため、ローダー API で FragmentStatePagerAdapter を使用しようとすると、この問題が発生しましたが、UI に値が設定されていません。つまり、onLoadFinished() が完了し、値が TextView、ImageView、および changeCursor に設定されていることを意味します。 XML で設定したとおりの UI が表示されます。

問題を明確に説明できるかどうか見てみましょう。

リストがあり、アイテムをタップすると詳細ビューが表示されます。アイテムが選択されると、ids 配列と選択されたアイテムの位置の 2 つの要素が詳細に送信されます。

listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Intent intent = new Intent(ActionConstant.DETAIL);

                intent.putExtra("ids", ids);
                intent.putExtra("position", position);
                startActivity(intent);
            }
        });

したがって、DetailActivity には、ID と位置を使用して適切なデータをロードする FragmentStatePagerAdapter を持つ ViewPager があります。

@Override
    public void onCreate(Bundle savedIntanceState) {

        super.onCreate(savedIntanceState);
        setContentView(R.layout.detail);
        ids = getIntent().getLongArrayExtra("ids");
        int currentIndex = getIntent().getIntExtra("position",-1);

        mPagerAdapter = new DetailPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager, attaching the adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mViewPager.setAdapter(mPagerAdapter);
        mViewPager.setCurrentItem(currentIndex);

    }

そして、DetailPagerAdapter オーバーライド getItem と getCount (ids.length を返す)

        @Override
        public Fragment getItem(int i) {
            return DetailFragment.newInstance(ids[i]);
        }

DetailFragment では、newInstance がこれを行います

public static DetailFragment newInstance(long id) { DetailFragment f = new DetailFragment();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    args.putLong("_id", id);
    f.setArguments(args);

    return f;
}

および onLoadFinished が呼び出されたとき。

@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

        if (loader.getId() == 1)
            adapter.changeCursor(cursor);
        else if (loader.getId() == 2) {
            if (!cursor.moveToNext())
                return;

            textName.setText(cursor.getString(cursor.getColumnIndexOrThrow(TraderColumns.NAME)));


    }
}
4

1 に答える 1

0

エウレカ、何が起こっていたのかはかなり些細なことで、非常に理にかなっています。フラグメントの onResume() にありました

getActivity().getSupportLoaderManager().restartLoader(CONTACT_REQUEST, null, this);

getActivity().getSupportLoaderManager().restartLoader(TRADER_DETAIL_REQUEST, null, this);

したがって、これはアクティビティのsupportLoaderマネージャーを使用し、1つのインスタンスであるため、すべてのビューが台無しになります。代わりに私は使用します:

getLoaderManager().restartLoader(CONTACT_REQUEST, null, this);

getLoaderManager().restartLoader(TRADER_DETAIL_REQUEST, null, this);

于 2012-09-14T00:30:27.993 に答える