FragmentPagerAdapter getItem이 호출되지 않았습니다
FragmentPagerAdapter에서 프래그먼트를 재사용 할 수 없습니다. destroyItem () 메소드를 사용하여 프래그먼트를 삭제하고 있지만 여전히 getItem ()을 호출하지 않습니다. 2-3 이미지 만 있으므로 FragmentStatePagerAdapter 대신 FragmentPagerAdapter를 사용하고 있습니다.
public class ExamplePagerAdapter extends FragmentPagerAdapter {
ArrayList < String > urls;
int size = 0;
public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
super(fm);
urls = res;
size = urls.size();
}
@Override
public int getCount() {
if (urls == null) {
return 0;
} else {
return size;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new FloorPlanFragment();
Bundle b = new Bundle();
b.putInt("p", position);
b.putString("image", urls.get(position));
Log.i("image", "" + urls.get(position));
fragment.setArguments(b);
return fragment;
}
}
그리고 FragmentActivity에서
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
키스 답변 :
간단한 사용 FragmentStatePagerAdapter 대신 FragmentPagerAdapter .
나는 첫째로 나는 매우 어리석은 실수를하고있는 중이 야 나는이 질문을 삭제 생각하지만이 대답은 그 대신 같은 문제에 직면하고 누군가 도움이 될 것입니다 .. 답을 가지고 FragmentPagerAdapter
사용을 FragmentStatePagerAdapter
.
의견에 @BlackHatSamurai가 언급했듯이 :
이것이 작동하는 이유
FragmentStatePagerAdapter
는 사용되지 않는 조각으로 파괴 되기 때문 입니다.FragmentPagerAdapter
하지 않습니다.
를 사용하여 FragmentStatePagerAdapter
내 문제를 완전히 해결하지 못했습니다 onCreateView
. 뷰 호출기에서 하위 조각을 호출하지 않은 비슷한 문제 였습니다. 나는 실제로 내 FragmentPagerAdapter
안에 다른Fragment
것을 내포하고 있기 때문에 FragmentManager
모든 것들에 걸쳐 공유되어 오래된 조각의 인스턴스를 유지합니다. 수정은 대신 호스트 인스턴스의 getChildFragmentManager
생성자에게 인스턴스를 공급하는 것이 었습니다 FragmentPagerAdapter
. 뭔가 ...
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
이 getChildFragmentManager()
방법은 조각을 통해 액세스 할 수 FragmentManager
있으며 중첩 조각이 필요한 상황에서 해당 조각에 대한 개인 정보 를 반환하기 때문에 저에게 효과적이었습니다. 나는 이것이 내가했던 것과 같은 문제를 겪고있는 누군가를 돕기를 바랍니다.
- Keep in mind however to use
getChildFragmentManager()
your minimum API version must be atleast17 (4.2)
, so this may throw a wrench in your gears. Of course, if you are using fragments from the support library v4 you should be okay.
I did what @kanika and @Jraco11 had posted but I still had the problem.
So, after a lot of changes, I found one that worked for me and was added to my FragmentPagerAdapter the next code:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
According to what I read, getItemPosition is used to notify the ViewPager whether or not to refresh an item, and to avoid updates if the items at the visible positions haven't changed.
There are two different scenarios : 1.) You have same layout for every pager : In that case, it will be better if you'll extend your custom adapter by PagerAdapter and return a single layout.
2.) You have different layout for every pager : In that case, it will be better if you'll extend your custom adapter by FragmentStatePagerAdapter and return different fragmets for every pager.
Override long getItemId (int position)
FragmentPagerAdapter
caches the fragments it creates using getItem
. I was facing the same issue- even after calling notifyDataSetChanged()
getItem
was not being called.
This is actually a feature and not a bug. You need to override getItemId
so that you can correctly reuse your fragments. Since you are removing fragments, your positions are changing. As mentioned in the docs:
long getItemId (int position)
Return a unique identifier for the item at the given position.
The default implementation returns the given position. Subclasses should override this method if the positions of items can change.
Just provide a unique id to each fragment and you're done.
Using a FragementStatePagerAdapter
or returning POSITION_NONE
in int getItemPosition (Object object)
is wrong. You will not get any caching.
method getItem()
is used only to create new items. Once they created, this method will not be called. If you need to get item that is currency in use by adapter, use this method:
pagerAdapter.instantiateItem(viewPager, TAB_POS)
I found that setting a listener on the tab-layout stopped this from being called, probably because they only have space for one listener on tabLayout.setOnTabSelectedListener
instead of an array of listeners.
참고URL : https://stackoverflow.com/questions/12581896/fragmentpageradapter-getitem-is-not-called
'Programing' 카테고리의 다른 글
정규 표현식을 사용하여 Ruby의 문자열에서 부분 문자열 추출 (0) | 2020.07.20 |
---|---|
JS 날짜 시간을 MySQL 날짜 시간으로 변환 (0) | 2020.07.20 |
에뮬레이터에서 AVD를 시작할 수 없음 : QT 라이브러리를 찾을 수 없음 (0) | 2020.07.20 |
ID로 사용자 프로필 사진 가져 오기 (0) | 2020.07.20 |
UIButton의 titleLabel에 대해 x, y 위치를 조정할 수 있습니까? (0) | 2020.07.20 |