【问题标题】:FragmentStatePagerAdapter is not setting the UI elemtents when using Loader API使用 Loader API 时 FragmentStatePagerAdapter 未设置 UI 元素
【发布时间】:2012-09-10 00:53:03
【问题描述】:

所以我现在在尝试将 FragmentStatePagerAdapter 与 Loader API 一起使用时遇到了这个问题,但在 UI 中没有设置任何值我的意思是当 onLoadFinished() 完成并将值设置为 TextView、ImageView 和 changeCursor 时适配器它没有反映它,我看到了我在 XML 中设置的 UI。

看看我能不能把问题解释清楚。

我有一个列表,当一个项目被点击时,你会看到一个详细的视图。当一个项目被选中时,两个元素被发送到细节,ids 数组和被选中项目的位置。

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 中有一个 ViewPager,它有一个 FragmentStatePagerAdapter,它使用 id 和位置来加载正确的数据。

@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)));


    }
}

【问题讨论】:

    标签: android android-fragments android-viewpager android-loader


    【解决方案1】:

    Eureka,发生的事情相当琐碎,但很有意义,我在 Fragment 的 onResume() 中有

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

    所以这将使用活动的 supportLoader 管理器,因为这是一个实例,它让我所有的视图都搞砸了。相反,我使用:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多