2016-06-23 11 views
1

У меня есть три вкладки, которые имеют три различные фрагменты с ListView для каждого фрагмента, и это выглядит следующим образом:Refresh ViewPager фрагмент не работает должным образом

enter image description here

Когда я нажатие кнопки белого список пункт добавлен в tab2, и если я нажимаю фиолетовый элемент списка кнопок, добавляется в tab3. Tab3 обновляется, потому что у viewPager есть ограничение по умолчанию для экрана 1, поэтому, когда я перехожу к tab3, он создается, и на тот момент у него есть свой новый список, но tab2 уже создается, когда приложение запускается, поэтому мне нужно его обновить каким-то способом. Поэтому я создал метод updateView() в фрагменте tab2, и я вызываю этот метод в OnPageChangeListener(), он обновляет представление, но он вызывается каждый раз, когда я перехожу на tab2, и это вызывает lag.All, я хочу сделать это, чтобы удалить этот список и добавьте его в tab2, и он будет удален, и он будет добавлен в tab2, но когда я перейду к tab2, я не смогу его увидеть, сразу после закрытия приложения появится или когда вызов tab2 вызывает onResume, onCreate ...

Async метод, который загружает элементы списка в фоновом режиме: метод

public class AchievedDreamFragment extends Fragment { 

ListView achievedListView; 
Activity activity; 
ArrayList<AchievedCloud> achievedClouds; 


AchievedListAdapter achievedListAdapter; 
AchievedActionHandler achievedActionHandler; 

private GetAvedTask atask; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
activity = getActivity(); 
achievedActionHandler = new AchievedActionHandler(activity); 

} 


public class GetAvedTask extends AsyncTask<Void, Void, <AchievedCloud>> { 

private final WeakReference<Activity> activityWeakRef; 


public GetAvedTask(Activity context) { 
    this.activityWeakRef = new WeakReference<Activity>(context); 
} 

@Override 
protected ArrayList<AchievedCloud> doInBackground(Void... arg0) { 
    Log.e(TAG,"do in background"); 
    //achievedActionHandler = new AchievedActionHandler(activity); 
    ArrayList<AchievedCloud> dreamList = achievedActionHandler.getaDreams(); 
    return dreamList; 
} 

@Override 
protected void onPostExecute(ArrayList<AchievedCloud> adrmList) { 
    Log.e(TAG,"on Post execute"); 
    if (activityWeakRef.get() != null 
      && !activityWeakRef.get().isFinishing()) { 
     achievedClouds = adrmList; 
     if (adrmList != null) { 
      if (adrmList.size() != 0) { 
       achievedListAdapter = new AchievedListAdapter(activity, 
         adrmList); 
       achievedListView.setAdapter(achievedListAdapter); 
       achievedListAdapter.notifyDataSetChanged(); 
      } 
     } 

    } 
} 
} 

UpdateView() в одном фрагменте, где AsyncTask является:

public void updateView() { 

    atask = new GetAvedTask(activity); 
    atask.execute((Void) null); 

} 

ViewPager OnPageChangeListener():

@Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 

     if(position == 1){ 
      achievedDreamFragment.updateView(); 

     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

Я попробовал, а на адаптере getItemPosition POSITION_NONE, но это не исправить какие-либо идеи, что я мог бы попробовать?

ответ

1

я не в полной мере понять, что вы хотите достичь, но я думала, что вы ищете это:

How to determine when Fragment becomes visible in ViewPager

+0

когда я пролистывание tab2 после нажатия кнопки белой Я хочу видеть, что пункт там – kosas

+1

чувак все это время я был что-то вроде этого, глядя СПАСИБО !!! – kosas

0

У меня был такой же выпуск. Я не уверен, что это самый чистый способ сделать это, но это сработало для меня.

Я создал переменную SharedPreferences. В onClick, чтобы добавить элемент списка в Фрагмент, я обновил переменную SharedPreferences до «refresh», а также добавил Intent для возврата в MainActivity. В MainActivity in onCreate я проверяю значение varible SharedPreferences. Если он равен «обновить», я обновил переменную до «» и добавил намерение вернуться к исходному фрагменту.

0

Вы можете получить экземпляр фрагмента tab2. Затем вызовите ваш метод updateView() на этом экземпляре непосредственно:

Object anObject = viewPager.getAdapter().instantiateItem(viewPager, 1); 
// 1 is the Tab2; viewPager is the ViewPager in main activity 
if (anObject instanceof Tab2) { // Tab2 is your tab2's fragment 
    Tab2 tab2 = (Tab2) anObject; 
    tab2.updateView(); 
} 
0

Для этого царя «EventBus» проблемы совершенна.

Сначала добавьте зависимость: compile 'org.greenrobot:eventbus:3.0.0' в ваш build.gradle файл.Для получения дополнительной информации смотрите здесь: EventBus

В TAB2 добавить эти методы:

` 
@Override 
public void onStart(){ 
    super.onStart(); 
    EventBus.getDefault().register(this); 
} 

@Override 
public void onStop(){ 
    EventBus.getDefault().unregister(this); 
    super.onStop(); 
} 
public void onEventItemAdded(EventAddItemTab2 event){ 
     loadItems(); // reload items from DB/Web using asynctask and set these items to the adapter 

} 

`

Создать новый класс в пакете с именем, например models, этот класс: public class EventAddItemTab2{ // empty here }

Затем в Tab1, когда вы нажимаете кнопку «Белый», вызывайте это:

EventBus.getDefault().post(new EventAddItemTab2());

Дополнительная информация: Когда вы вызываете метод EventBus .post, это автоматически вызовет метод onEventItemAdded в Tab2. Вы можете использовать этот шаблон для Tab3 тоже. Это решение идеально подходит для больших приложений, где вы должны отделить логику. Tab1, Tab2 и Tab3 не должны знать о существовании друг друга.

0

К сожалению сказать, но ваше требование не ясно для меня, но из что я понимаю, если вы хотите достичь этого с помощью знака POSITION_NONE, тогда у вас есть call adapter.notifyDatasetChanged() для адаптера viewpager. Затем он обновит все представления и, если вы вызвали ваш метод внутри одного из переопределенных методов, он получит updated.Также вы можете называть это нажатием кнопки.

0

Все, что мне нужно было сделать, это вызвать этот метод на моем фрагменте tab2. Он вызывается каждый раз, когда фрагмент виден!

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible){ 

     //load listview 
    } 
} 
Смежные вопросы