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가
어떤 아이디어를 호출해야 할 때
당신이 조각에 대한 설정 값을 얻기 위해 pojoFrag을 사용할 수를 호출 할 필요가 클릭하면? 나는 정말로 도움이 필요하다. –
예외를 게시 할 수 있습니까? – ppvi