4

내 앱 중 하나에서 ViewPager의 양쪽에 조각을 추가해야합니다. 무엇보다도 먼저 5 개의 피드를 상수로 가져오고 ViewPager는 인덱스 2에서 피드를 표시합니다. 즉, 현재 표시된 단편에 인덱스 2에있는 데이터가 포함됩니다. 전체적으로 내 ViewPager는 시작시 5 개의 피드 중심을 표시하고 i 처럼 2로 ViewPager 현재 항목을 설정하여 달성이FragmentStatePagerAdapter를 사용하여 ViewPager의 양쪽에 조각을 동적으로 추가하기

viewPager.setCurrentItem(2); 

이제 사용자 양쪽으로 스 와이프, 그가 중심 위치에서 왼쪽으로 스 와이프 때, 나는 다음 피드 즉, 서버에서 가져오고에 피드를 추가 보일 것입니다 이

feedsList.add(0, modelClassObject); // feedsList will contain all feeds and has been used by adapter to show data in fragments. 
adapter.notifyDataSetChanged(); 

내가 중심 위치에서 오른쪽으로 스 와이프하면, 내가 마지막으로 단순히 리에서 피드를 추가 할 것 같은 내 ViewPager의 제로 인덱스 난 단지 feedsList의 끝에있는 권리 즉에 피드를 추가하는 경우 KE이

feedsList.add(modelClassObject); 
adapter.notifyDataSetChanged(); 

지금 문제는, 모든 것이 잘 작동하지만 난 제로 인덱스에 피드를 추가 할 때 문제가 온다. 내 어댑터가 제로 위치에 추가 된 새 피드를 표시하지 않고 대신 기존 피드 중 하나를 반복하고 오른쪽 피드는 왼쪽 피드가 아닌 나머지 피드를 반복합니다. 나는 모든 것을 시도해 봤지만 아무 일도 일어나지 않았습니다. 다음은 어댑터 코드입니다.

private class HorizontalPagerAdapter extends FragmentStatePagerAdapter { 

    public HorizontalPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     return FeedUserProfileFragment.newInstance(feedsList.get(arg0), 
       arg0); 
    } 

    @Override 
    public int getCount() { 
     return feedsList.size(); 
    } 

} 

내가이

@Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

하지만 결과 .. :(심각한 필요에 따라서

가, 누군가가 그 이전에 행한 경우 사용하고 동일한 문제에 직면 한 해줘 내가 뭘 잘못하고 있는지 알겠다. 내 ViewPager의 제로 인덱스에서만 프래그먼트를 추가하면된다.

+0

FeedUserProfileFragment.newInstance (feedsList.get (arg0), arg0); 코드를 게시하십시오. – mmlooloo

+0

이 문제와 관련이 있다고 생각하지 않습니다. –

+0

나는 또한 동일한 문제에 직면하고 있습니다. – Neeraj

답변

2

나는 비슷한 문제에 봉착했다. 내 솔루션은

이다.
  1. 처음에는 어댑터 자체에서 선언되므로 어댑터의 인스턴스를 만들 때 자신의 목록을 가질 수 있습니다.
  2. 은 어댑터 클래스의 getItem(int arg0) 메서드를 수정하여 해당 항목 위치에 따라 목록에서 특정 항목을 반환합니다.
  3. 새 프래그먼트를 만들 때 인스턴스화 메서드를 사용하여 만든 다음 프래그먼트에 추가하십시오.

    어댑터 클래스 :

그래서 완전한 해결책은 될 것

private class HorizontalPagerAdapter extends FragmentStatePagerAdapter { 

public List<Fragment> feedsList; 

    public HorizontalPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     return feedsList.get(i); 
    } 

    @Override 
    public int getCount() { 
     return feedsList.size(); 
    } 

} 

어댑터 만들 때 :

public static YourPageAdapter adapter_obj; // make sure it's static object 
adapter_obj = new YourPageAdapter(getSupportFragmentManager()); 
adapter_obj.feedsList = new ArrayList<Fragment>(); 
// then add the list of fixed fragments to it(the 5 in the beginning) 
adapter_obj.feedsList = fragments_list; // an ArrayList contains the 5 fragments 

을 때 새로운를 만들려면 단편 :

adapter_obj.feedsList.add(0, Fragment.instantiate(mContext, ViewPager_Container_Class.class.getName(), page)); 
adapter_obj.notifyDataSetChanged(); 
+0

실제로 하나의 조각 만 사용하고 있으며 동일한 조각 내의 데이터가 변경됩니다. 그래도 여전히 내가 Fragment ArrayList를 가져야한다고 생각하거나 대신 새로운 Array가 추가 될 때 ArrayList를 알리고 arrayList를 알려야합니다. –

+0

"ArrayList"에 데이터를 추가하고 변경 사항을 알려주지 않아야한다고 생각합니다. 조각화와 잘 어울리지 않을 것이라고 생각합니다. 조각 ArrayList 또는 다른 부분으로 조각을 만들면 처음부터 조각을 다시 만들 수 있습니다. 모든 변경 사항이 적용됩니다. –

+0

그게 문제가된다면, 나는 결국 피드를 추가 할 수 없을 것입니다. 그래서 그 방식으로도 효과가 있어야했습니다. 어쨌든, 나는 너의 것도 시도해 봤지만 예외를 야기했다. 나는 Exceptions를 찾았지만 모든 것이 헛된 것입니다. 그래서 마침내 나는 당분간 어댑터를 매기로 결정했다. –

1

FragmentStatePagerAdapter는 새 프래그먼트를 추가 할 때 바로 처리 할 수 ​​없습니다.

  1. 끝에 새로운 조각을 추가

    해결

    이입니다.
  2. 호출 notifyDataSetChanged();
  3. 조각을 앞으로 가져 오십시오.
  4. 호출 notifyDataSetChanged();

BTW, getItemPosition()가 모두 함께 정확한 위치를 반환해야합니다 : 코드로,

public int getItemPosition(Object object) 
{ 
    return feedsList.indexOf(object); 
} 

그래서, 그것은해야한다 :

newFrag = Fragment.instantiate(...); 
feedsList.add(newFrag); 
adapter_obj.notifyDataSetChanged(); 

feedsList.remove(feedsList.size() - 1); 
feedsList.add(0, newFrag); 
adapter_obj.notifyDataSetChanged(); 

내가 FragmentStatePagerAdapter의 구현은 '아무튼 생각 새로운 조각을 추가하고 위치를 변경하는 것이 동시에 일어날 것을 기대하지 마십시오.

+0

FragmentPagerAdpter가 앞쪽에 추가 된 객체를 처리 할 수없는 이유를 설명하십시오. –

관련 문제