[英]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.