簡體   English   中英

更改片段后如何更新ListView適配器

[英]How to update listview adapter after changing fragment

我有兩個片段FragmentA和FragmentB。 當我在FragmentB中單擊一個項目時,它會在fragmentTransaction中開始攜帶一些數據。

FragmentA有一個自定義的列表視圖適配器,當有來自FragmentB的數據時,需要進行更改。

問題是它沒有改變。

這是片段A中的代碼

 public class CardsFragment extends ListFragment { protected List<CardModel> list = new ArrayList<CardModel>(); protected ArrayAdapter<CardModel> adapter; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_cards, container, false); return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); adapter = new CardAdapter(getListView().getContext(), list); Bundle args = getArguments(); if (args != null) { LoadCards(args.getString("key"), args.getString("keyId")); } else{ LoadAllCards(); } } private void LoadAllCards() { /** query the database code **/ list.add(...); if (getListView().getAdapter() == null) { setListAdapter(adapter); } else { adapter.refill(list); } } private void LoadCards(String key, String keyId) { /** query the database code **/ list.add(...); if (getListView().getAdapter() != null) { adapter.refill(list); } } /** Refill function from adapter class public void refill(List<CardModel> cards){ list.clear(); list.addAll(cards); notifyDataSetChanged(); } **/ } 

好吧,這是我面臨的一個非常棘手的問題。 在同一問題上有很多關於stackoverflow的帖子。 我在這里找到了這個問題的可行示例

添加一個哈希映射以保留所有已實例化的片段的標簽。 這樣,從我的FragmentActivity中,我可以檢查Fragment是當前片段,在這種情況下,我在Fragment中調用onResume()方法來刷新要刷新的內容。

內部FragmentPagerAdapter

我定義了一個哈希圖來存儲片段的標簽

mFragmentTags = new HashMap<Integer,String>();  

然后,我覆蓋了InstantiateItem方法,以將Fragment的標簽和位置一起保存在哈希圖中。

@Override  
public Object instantiateItem(ViewGroup container, int position) {  
Object obj = super.instantiateItem(container, position);  
if (obj instanceof Fragment) {  
    // record the fragment tag here.  
    Fragment f = (Fragment) obj;  
    String tag = f.getTag();  
    mFragmentTags.put(position, tag);  
}  
return obj;  
}  

另外,我創建了一個方法,該方法將根據位置返回先前創建的片段的標簽

public Fragment getFragment(int position) {  
    String tag = mFragmentTags.get(position);  
    if (tag == null)  
        return null;  
    return mFragmentManager.findFragmentByTag(tag);  
}  

在FragmentActivity內部,onPageSelected的內部方法

Fragment fragment = ((FragmentPageAdapter)viewpager.getAdapter()).getFragment(arg0);  

if (arg0 ==1 && fragment != null)  
{  
    fragment.onResume();  
}  

在片段的onResume內部,刷新listView。 這應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM