0

ViewPager에서 단편을 업데이트/교체하는 데 문제가 있습니다. 문제는 이전 조각이 단순히 새로운 조각으로 대체되지 않는다는 것입니다. stackoverflow에 대한 몇 가지 솔루션을 읽고 시도했지만 여전히 작동하지 않습니다. 누구에게 어떤 아이디어가 있습니까? 나는 아래에서 무엇을하려고하는지 설명 할 것이다. ViewPager의 조각 업데이트

은 내가 생각이 나는 조각에 PojoGroup를 결합하는 것입니다 뽀조 클래스

public class Pojo { 
public String text; 
public Pojo(String text) { this.text = text; } 
} 

내가 그룹 클래스가, PojoGroup

public class PojoGroup { 
public String title; 
public List<Pojo> pojos; 
public PojoGroup(String title, List<Pojo> pojos) { 
    this.title = title; 
    this.pojos = pojos; 
} 
} 

에게 있습니다. 조각의 XML 인 pojogroup_frag.xml은 다음과 같습니다. 보시다시피, 나는 tvTitle을 PojoGroup.title로 설정하고 Pojo 목록을 ListView에 바인딩합니다.

<LinearLayout xmlns:android="..." 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
<TextView android:id="@+id/tvTitle" android:layout_width="..." android_layout_height="..."/> 
<ListView android:id="@+id/listView" android:layout_width="..." android_layout_height="..."/> 
</LinearLayout> 

완성도를 높이려면 pojo 목록을 ListView에 바인딩하는 my pojo 어댑터를 사용하십시오.

public class PojoAdapter extends ArrayAdapter<Pojo> { 
public PojoAdapter(Context ctx, int resId, List<Pojo> objects) { 
    super(ctx, resId, objects); 
} 
public View getView(int pos, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if(null == v) { 
    Context ctx = getContext(); 
    LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflat(R.layout.pojo_row, null); 
    } 
    TextView tv = (TextView)v.findViewById(R.id.tvText); 
    Pojo pojo = getItem(pos); 
    tv.setText(pojo.text); 
} 
} 

내 pojo_row.xml 파일은 다음과 같습니다.

<LinearLayout xmlns:android="..." 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
<TextView android:id="@+id/tvText" android:layout_width="..." android_layout_height="..."/> 
</LinearLayout> 

내 main.xml에는 Button과 ViewPager가 있습니다. 내 MainActivity 클래스는 다음과 같습니다.

public class MainActivity extends FragmentActivity { 
PojoGroupPagerAdapter pagerAdapter; 
ViewPager viewPager; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button b = (Button)findViewById(R.id.bReplace); 
    b.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { generateAndReplaceFrags(); } 
    }); 

    pagerAdapter = new PojoGroupPagerAdapter(getSupportFragmentManager()); 
    viewPager = (ViewPager)findViewById(R.id.pager); 
    viewPager.setAdapter(pagerAdapter); 
} 

void generateAndReplaceFrags() { 
    //PojoGroupFactory just generates a random List of PojoGroups 
    List<PojoGroup> groups = PojoGroupFactory.getPojoGroups(); 
    pagerAdater.setPojoGroups(groups); 
} 
} 

내 pojo 조각 인 PojoFrag는 다음과 같이 보입니다.

public class PojoFrag extends Fragment { 
PojoGroup pojoGroup; 
View view; 
TextView tvTitle; 
ListView listView; 

public PojoFrag(PojoGroup group) { pojoGroup = group; } 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.pojogroup_frag, null); 
    listView = (ListView)view.findViewById(R.id.listView); 
    tvTitle = (TextView)view.findViewById(R.id.tvTitle); 

    List<Pojo> objects = pojoGroup.getPojos(); 
    listView.setAdapter(new PojoAdapter(getActivity(), R.id.tvText, objects)); 
    tvTitle.setText(pojoGroup.title); 
    return view; 
} 
} 

PojoGroupPagerAdapter 클래스는 너무 복잡하지 않고, 유래 이전에 제안 된 변경에 대한 제안의 일부가 될 경우이 클래스이다. 그러나, 그것은 여전히 ​​작동하지 않습니다. 필요한 경우 전체 프로젝트 소스 코드를 제공 할 수 있습니다.

public class PojoGroupPagerAdapter extends FragmentPagerAdapter { 
List<PojoGroup> pojoGroups; 
Map<Integer, Fragment> fragments; 

public PojoGroupPagerAdapter(FragmentManager fm) { 
    super(fm); 
    fragments = new HashMap<Integer, Fragment>(); 
} 

public Fragment getItem(int position) { 
    Integer key = new Integer(position); 
    if(fragments.containsKey(key)) { 
    return fragments.get(key); 
    } 

    PojoGroup group = pojoGroups.get(position); 
    PojoFrag frag = new PojoFrag(group); 
    fragments.put(key, frag); 
    return frag; 
} 

public int getCount() { 
    return (null == pojoGroups) ? 0 : pojoGroups.size(); 
} 

public int getItemPosition(Object object) { 
    if(!fragments.containsKey(object)) 
    return POSITION_NONE; 
    return POSITION_UNCHANGED; 
} 

public void setPojoGroups(List<PojoGroup> pojoGroups) { 
    this.pojoGroups = pojoGroups; 
    fragments.clear(); 
    int total = pojoGroups.size(); 
    for(int i=0; i < total; i++) { 
    Integer key = new Integer(i); 
    PojoGroup group = pojoGroups.get(i); 
    PojoFrag frag = new PojoFrag(group); 
    fragments.put(key, frag); 
    } 
    notifyDataSetChanged(); 
} 
} 

당신이 볼 수있는

, 나는 getItemPosition (Object) 메소드를 오버라이드 (override), 그러나 이것은 여전히 ​​새로운 하나 기존의 뷰를 대체하는 데 도움이되지 않습니다. 나는 또한 FragmentTransaction과 함께 놀았지만, 이것도 작동하지 않습니다. 새로운 ViewPager 객체를 생성하여 메인 뷰에 추가하려고합니다. 그러나, 나는 아마 이상한 예외를 얻고있다. 아마도 AttributeSet을 구성하는 방법을 모르기 때문이다.

이 문제에 대한 도움을 주시면 감사하겠습니다. 여기

데모 프로젝트에 대한 링크입니다 : http://www.box.com/s/xbtm3amtkj7f13j2llm4

+0

어떤 아이디어를 호출해야 할 때

int currentItem = viewPageAdapter.getCurrentItem()//current frangment PojoGroupPagerAdapter adapter = (PojoGroupPagerAdapter) viewPagerApdater.getAdapter(); PojoFrag pojoFrag = adapter.getItem(currentItem) 

당신이 조각에 대한 설정 값을 얻기 위해 pojoFrag을 사용할 수를 호출 할 필요가 클릭하면? 나는 정말로 도움이 필요하다. –

+0

예외를 게시 할 수 있습니까? – ppvi

답변

0
ViewPager는 당신의 PojoGroupPagerAdapter 클래스
PojoGroupPagerAdapter의이 경우 viewPagerAdapter을 가지고 내 FragmentPagerAdapter

public class StudentPagerAdapter extends FragmentStatePagerAdapter { 

    private List<Fragment> listFragments; 

    public StudentPagerAdapter(FragmentManager fm, List<Fragment> _listFragments) { 
     super(fm); 
     this.listFragments = _listFragments; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return listFragments.get(position); 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return "Page " + (position + 1); 
    } 
} 

를 참조

확인하자 많은 조각을 가지고 (그것의 당신의 PojoFrag 클래스), viewPager는 매번 한 조각을 표시합니다.
그래서 버튼은

viewPagerAdapter.notifyDataSetChanged()//or adapter of current fragment