Android 从抽屉布局中刷新Viewpager
上下文: 我有一个抽屉布局,其中包含我从Realm获得的城市列表。ViewPager已显示该列表。可以直接从抽屉布局中删除城市 问题:当我从抽屉布局中删除城市时,我调用mViewPager.getAdapter()。notifyDataSetChanged,viewPager不会重新加载。由于抽屉布局显示在ViewPager上,因此关闭它时不会重新加载,并且ViewPager/Realm返回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
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);
}