2016-08-11 3 views
1

컨텍스트 : 나는 렐름에서 얻은 도시 목록을 포함하는 drawerLayout을 가지고 있습니다. ViewPager는 이미 해당 목록을 표시하고 있습니다. 당신은 DrawerLayoutDrawerLayout 내의 Viewpager 새로 고침

문제에서 직접 도시를 삭제할 수 있습니다 나는 DrawerLayout에서 도시를 삭제하면, 내가 mViewPager.getAdapter()를 호출 notifyDataSetChanged의 viewPager가 다시로드되지 않습니다.. drawerLayout은 ViewPager에 표시되기 때문에 닫을 때 다시로드 할 필요가 없으며 ViewPager/Realm은 다시 탐색 할 때 java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 4 > 4을 반환합니다.

내가 어떻게 해결할 수 있는지에 대한 단서가 있습니까? 그것이 어떻게 작동하는지

정보를 제공 할 목적으로

은 여기에 다음 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); 

    } 

을 포함하는 활동에서 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(); 
     } 
    }); 

들어있는 BaseActivity에서는 ** 수정

나는 getItemPositi 에 불렀다. 그래서 문제는 아닙니다.

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

viewPager에서 notifyDataSetChanged()를 호출하면 조각을 다시 만들지 않으므로 조각에 데이터를 새로 고치라고 지시해야합니다. LocalBroadCastManager를 사용하여 조각을 지정하여 데이터를 새로 고칠 수 있습니다. –

+0

멋진 솔루션을 제공합니다. 그래서 LocalBroadcast를 제 위치에 두었습니다. 제대로 작동하지만 어떻게 강제로 재생성합니까? ViewPager를 다시 설치함으로써? 감사합니다 – Isabelle

+0

글쎄, 난 같은 문제가 있었는데 결코 fragmentPager를 강제로 조각을 다시 만들었습니다. –

답변

1

변화가 실제로 발생하는 경우에만 당신은 너무

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

아니면 이런 종류의 것.

+0

주위에와 주셔서 감사합니다. 내 ViewPager에서 RealmAdapter를 사용하지 않지만 고전적인 ViewPager를 사용하는 경우 문제가됩니까? – Isabelle

+0

'RealmAdapter'는 필요 없지만 트랜잭션 직후가 아닌'RealmChangeListener'에서'notifyDataSetChanged'를 호출해야합니다. – EpicPandaForce

+0

좋아요, 답변을 테스트하고 있습니다 :) – Isabelle

관련 문제