我有两个片段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();
}
**/
}
&#13;
答案 0 :(得分:0)
嗯,这是我遇到的一个非常棘手的问题。 stackoverflow上有相当多的帖子在同一个问题上。我找到了这个问题的一个有效例子here.
添加哈希映射以保留已实例化的所有片段的标记。这样,从我的FragmentActivity,我可以检查片段何时是当前片段,在这种情况下,我调用片段中的onResume()方法来刷新我想要刷新的内容。
Inside FragmentPagerAdapter
我定义了一个哈希映射来存储片段的标签
mFragmentTags = new HashMap<Integer,String>();
然后我覆盖了instantiateItem方法,将片段的标签与位置一起保存在hashmap中。
@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。这应该可以解决问题。