Android 从抽屉布局中刷新Viewpager

Android 从抽屉布局中刷新Viewpager,android,android-viewpager,reload,drawerlayout,Android,Android Viewpager,Reload,Drawerlayout,上下文: 我有一个抽屉布局,其中包含我从Realm获得的城市列表。ViewPager已显示该列表。可以直接从抽屉布局中删除城市 问题:当我从抽屉布局中删除城市时,我调用mViewPager.getAdapter()。notifyDataSetChanged,viewPager不会重新加载。由于抽屉布局显示在ViewPager上,因此关闭它时不会重新加载,并且ViewPager/Realm返回java.lang.ArrayIndexOutOfBoundsException:rowIndex>ava

上下文: 我有一个抽屉布局,其中包含我从Realm获得的城市列表。ViewPager已显示该列表。可以直接从抽屉布局中删除城市

问题:当我从抽屉布局中删除城市时,我调用mViewPager.getAdapter()。notifyDataSetChanged,viewPager不会重新加载。由于抽屉布局显示在ViewPager上,因此关闭它时不会重新加载,并且ViewPager/Realm返回
java.lang.ArrayIndexOutOfBoundsException:rowIndex>available rows:4>4

你知道我怎么解决这个问题吗

以下是其工作原理,仅供参考: **在BaseActivity中,包含抽屉布局的**

mCityListAdapter = new CityListAdapter(getBaseContext(), RealmHelper.getStoredCities(), new CityListAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            mPager.setCurrentItem(position);
            mDrawerLayout.closeDrawers();
        }
    }, new CityListAdapter.OnItemLongClickListener() {
        @Override
        public void onItemLongClick(final int position) {
            final CharSequence[] items = {getString(R.string.action_delete_city)};
            AlertDialog.Builder builder = new AlertDialog.Builder(BaseActivity.this);
            builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    RealmHelper.removeCity(RealmHelper.getStoredCities().get(position));
                    mPager.getAdapter().notifyDataSetChanged();
                }
            });
            builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();
                }
            });

            builder.setTitle(getString(R.string.delete_city_label));
            builder.show();
        }
    });
在包含viewPager的活动中

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getLayoutInflater().inflate(R.layout.fragment_pager, mFrameLayout);

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        mPager.addOnPageChangeListener(this);

        mAdapter = new FragmentStatePageSupportAdapter(getSupportFragmentManager(), RealmHelper.getStoredCities().size(), this, RealmHelper.getStoredCities());
        mPager.setAdapter(mAdapter);
        mPager.setOffscreenPageLimit(0);

    }
编辑

我确实覆盖了getItemPosition,它被称为。所以这不是问题所在

The @Override
    public int getItemPosition(Object object) {
        Log.v("results", "called getitempostion");
        return POSITION_NONE;
    }  

您应该仅在实际发生更改时通知数据集,如下所示

mRealmChangeListener = new RealmChangeListener() {
    @Override
    public void onChange(Object element) {
        mCityListAdapter.notifyDataSetChanged();
    }
}

RealmHelper.getStoredCities().addChangeListener(mRealmChangeListener);

编辑:好吧,我想在这种情况下,你应该走更长的路线:

mRealmChangeListener = new RealmChangeListener() {
    @Override
    public void onChange(Object element) {
        mCityListAdapter.notifyDataSetChanged();
    }
}

RealmResults<City> listenerSet;
Realm realm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    realm = Realm.getDefaultInstance();
    listenerSet = realm.where(City.class).findAll();
    listenerSet.addChangeListener(mRealmChangeListener);
}
mrealmchangesetener=newrealmchangesetener(){
@凌驾
公共void onChange(对象元素){
mCityListAdapter.notifyDataSetChanged();
}
}
RealmResults监听器集;
境界;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
realm=realm.getDefaultInstance();
listenerSet=realm.where(City.class).findAll();
addChangeListener(mRealmChangeListener);
}

或者类似的东西。

在viewPager上调用notifyDataSetChanged()不会重新创建片段,因此您必须告诉片段刷新它们的数据。因此,您可以使用LocalBroadCastManager通知片段刷新数据。听起来是一个不错的解决方案。所以我把本地广播放在适当的位置,它工作得很好,但是你怎么强迫他们重新创建呢?通过再次实例化ViewPager?谢天谢地,我也有同样的问题,但我从来没有让viewPager强制重新创建片段。也许问题与领域相关。我正在调查。我想我正面临一个已知的错误。谢谢你的帮助。如果我的ViewPager不使用RealmAdapter而是使用经典的,这是不是一个问题?你不需要
RealmAdapter
,但你必须在
RealmChangeListener
中调用
notifyDataSetChanged
,而不是直接在事务之后调用。好吧,我正在测试你的答案:)出于某种原因,在检查日志之后,删除我的城市时不调用onChange T-T我很接近
mRealmChangeListener = new RealmChangeListener() {
    @Override
    public void onChange(Object element) {
        mCityListAdapter.notifyDataSetChanged();
    }
}

RealmResults<City> listenerSet;
Realm realm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    realm = Realm.getDefaultInstance();
    listenerSet = realm.where(City.class).findAll();
    listenerSet.addChangeListener(mRealmChangeListener);
}