2015-09-26 6 views
1

В настоящее время у меня есть 3 фрагмента (вкладки) и в настоящее время используется viewpager. У меня есть 1 список для каждого фрагмента, и я хочу уведомить другого, когда что-то произойдет, после нажатия на представление. Я попытался использовать notifyDataSetChanged() для setOnPageChangeListener() для mainactivity. Проблема в том, что я могу видеть, что данные вставляются при изменении вкладок. Поскольку изменение происходит после изменения вкладок.notifyDataSetChanged() из другого фрагмента

+0

Поскольку вы используете пейджер представления, у него есть возможность выбрать сколько фрагментов нужно загружать по обе стороны от текущего фрагмента, скажем, что 1.So 1 фрагмент будет загружен по обе стороны от текущего, поэтому, если вы попытаетесь ссылаться на любой фрагмент, отличный от них, то коэффициенты либо ничего не будут произойдет, или он потерпит крах и скажет вам, что такого вида или адаптера нет, это не ответ, а что-то, на что нужно обратить внимание, когда вы его получите, мне тоже нужно то же самое. –

+0

Спасибо за примечание. Это очень раздражает, когда данные заселяются после изменения вкладок. XD –

ответ

3

Вы можете использовать широковещательные приемники для уведомления об изменении набора данных.

В вашем приемном фрагменте

public static final string RADIO_DATASET_CHANGED = "com.yourapp.app.RADIO_DATASET_CHANGED"; 

private Radio radio; 

В OnCreate метод:

radio = new Radio(); 

Класс радио внутри приемного фрагмента:

private class Radio extends BroadcastReceiver{ 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       if (intent.getAction().equals(RADIO_DATASET_CHANGED)){ 
        //Notify dataset changed here 
       } 
     } 

В приемном фрагменте на резюме метод:

@Override 
     protected void onResume() { 
      super.onResume();      
       //using intent filter just in case you would like to listen for more transmissions 
       IntentFilter filter = new IntentFilter(); 
       filter.addAction(RADIO_DATASET_CHANGED);      
       getActivity().getApplicationContext().registerReceiver(radio, filter); 
     } 

Убедитесь мы разрегистрировать приемник в методе OnDestroy

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    try { 
     getActivity().getApplicationContext().unregisterReceiver(radio); 
    }catch (Exception e){ 
     //Cannot unregister receiver 
    } 

} 

Фрагмент передачи набора данных изменилась

Затем из фрагмента, который уведомляя datasetchange просто сделать:

Intent intent = new Intent(ReceivingFragment.RADIO_DATASET_CHANGED); 
getActivity().getApplicationContext().sendBroadcast(intent); 
+1

Ну, IT FREAKING WORKED! : D Я сейчас схожу с ума, если вы можете просто увидеть меня. Огромное спасибо. : D Я только что заметил, что notifydatasetchanged() заставлял мою салфетку вкладок замедляться. Это не сработало, когда я попробовал notifydatasetchaned, вместо этого я снова позвонил в свой список. это сработало. и его более гладкой, чем раньше. :) –

+0

так рад за тебя! –

+0

Просто интересно? как работает незарегистрированныйReceiver()? Кажется, я не могу назвать это? –

0

В вашем MainActivity. Пробуйте этот код. Это может помочь.

@Override 
    public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     if (position ==0) 
      viewPager.getAdapter().notifyDataSetChanged(); 
     if (position == 1) 
      viewPager.getAdapter().notifyDataSetChanged(); 
if (position == 2) 
      viewPager.getAdapter().notifyDataSetChanged(); 
    } 
+0

Я думаю, что это точно, что @Renz делает прямо сейчас – maciekjanusz

+0

Вот где я его положил. на onpageslected из setonpagechangelistener. –

Смежные вопросы