从 DrawerLayout 中刷新 Viewpager
Refresh Viewpager from within the DrawerLayout
上下文:
我有一个 drawerLayout,其中包含我从 Realm 获得的城市列表。 ViewPager 已经在显示该列表。您可以直接从 DrawerLayout
中删除一个城市
问题: 当我从 DrawerLayout 中删除一个城市时,我调用 mViewPager.getAdapter().notifyDataSetChanged,viewPager 没有重新加载。由于 drawerLayout 显示在 ViewPager 上,因此当您关闭它时不会重新加载,而当我在其中导航回来时 ViewPager / Realm returns java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 4 > 4
。
你知道我该如何解决这个问题吗?
仅供参考,以下是它的工作原理:
**在 BaseActivity 中,包含 DrawerLayout **
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的activity
@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);
和
mCityListAdapter = new CityListAdapter(getBaseContext(), RealmHelper.getStoredCities(), new CityListAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
...
}
}, new CityListAdapter.OnItemLongClickListener() {
@Override
public void onItemLongClick(final int position) {
...
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(); // remove this
}
});
...
}
});
编辑:好的,我想在那种情况下你应该走更长的路:
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);
}
或者类似的东西。
上下文: 我有一个 drawerLayout,其中包含我从 Realm 获得的城市列表。 ViewPager 已经在显示该列表。您可以直接从 DrawerLayout
中删除一个城市问题: 当我从 DrawerLayout 中删除一个城市时,我调用 mViewPager.getAdapter().notifyDataSetChanged,viewPager 没有重新加载。由于 drawerLayout 显示在 ViewPager 上,因此当您关闭它时不会重新加载,而当我在其中导航回来时 ViewPager / Realm returns java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 4 > 4
。
你知道我该如何解决这个问题吗?
仅供参考,以下是它的工作原理: **在 BaseActivity 中,包含 DrawerLayout **
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的activity
@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);
和
mCityListAdapter = new CityListAdapter(getBaseContext(), RealmHelper.getStoredCities(), new CityListAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
...
}
}, new CityListAdapter.OnItemLongClickListener() {
@Override
public void onItemLongClick(final int position) {
...
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(); // remove this
}
});
...
}
});
编辑:好的,我想在那种情况下你应该走更长的路:
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);
}
或者类似的东西。