2012-02-23 108 views
0

我在嘗試更新/替換ViewPager中的碎片時遇到問題。問題是舊的碎片根本不會被新的碎片取代。我已經閱讀了幾個關於stackoverflow的解決方案,並嘗試過它們,但它仍然無法正常工作。任何人有任何想法爲什麼?我將在下面解釋我正在嘗試做什麼。更新ViewPager中的碎片

我有一個POJO類

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; 
} 
} 

的想法是,我將在PojoGroup結合的片段。片段的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列表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)方法,但是這仍然沒有幫助替換爲新一箇舊觀點。我也玩過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以獲取片段設定值?我真的需要幫助。 – 2012-03-06 03:44:33

+0

你能發佈例外嗎? – ppvi 2012-05-26 17:22:27

回答

0

好吧,讓我們看看我的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); 
    } 
} 

的ViewPager有viewPagerAdapter在這種情況下,它是你的PojoGroupPagerAdapter類
PojoGroupPagerAdapter有許多片段(這是你的PojoFrag類),viewPager每次顯示1個片段。
所以當按鈕被點擊時做了你必須調用

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