如何在另一个碎片中更新 ListView?

3
我有一个Activity,其中包含一个带有2个Fragment的ViewPager。其中一个Fragment用于向ListView添加项目,另一个Fragment则持有该ListView。
我已经尝试了近3天,但没有任何积极的结果。我如何从第一个Fragment更新另一个Fragment的ListView?
我正在尝试从持有ViewPager的Activity中调用更新ListView的方法,但它不起作用。
从ViewPager活动中调用该方法:
@Override
    public void onPageSelected(int position) {
    library.populateListView(getApplicationContext());
    aBar.setSelectedNavigationItem(position);
}

这是populateListView方法:

该方法用于填充列表视图:

public void populateListView(Context context){      
    CustomListViewAdapter customAdapter = new CustomListViewAdapter(getDatabaseArrayList(context), getActivity());

        if (lView != null)
        {
            lView.setAdapter(customAdapter);
        }
        customAdapter.notifyDataSetChanged();
}

然而这并不起作用,因为此时调用该函数时,lView变量(即ListView)为空,这是由于片段此时尚未显示。


将数组传递给另一个片段,然后在显示该片段时更新。 - Vic Vuci
3个回答

1

了解Fragment

请查看链接。我详细解释了Fragment的概念。

特别注意rootview的定义:

public void onActivityCreared(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
            // Do stuff on creation. This is usually where you add the bulk of your code. Like clickListners
        // You can define this object as any element in any of your xml's 
        View rootview = inflater.inflate(R.layout.xml_the_fragment_uses container,false);
        rootview.findViewById(R.id.your_id).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Do something 
        }
    });
} 

在上述情况中,我定义了一个按钮用于单击侦听器,但您也可以轻松定义ListView及其适当的方法。

备选方案

第二种方法可能是使用getViewgetActivity(请检查与活动通信部分)。

例如:

ListView listView = (ListView) getView().findViewById(R.id.your_listView_id);

OR    (more likely solution for your problem)

View listView = getActivity().findViewById(R.id.list);

请阅读this的帖子以获取更多信息。
祝好运。

1

我假设函数populateListView()是包含ListView的Fragment中的一个函数。在每次调用onPageSelected时,您都会调用populateListView()。您应该检查被选中的位置是什么。无论如何,populateListView()方法应该是包含ListView的Fragment的公共方法。您可以从Activity的Viewpager适配器中实例化该Fragment,然后调用此方法。这样,listView就不应为空。

@Override
public void onPageSelected(int position) {
ListViewFragment frag=(ListViewFragment)adapter.instantiateItem(viewPager, 1);
//here adapter is the ViewPager Adapter and you must supply the viewpager that    contains 
//the fragments and also the position of the fragment to instantiate. 
//For example 0 or 1 etc.
frag.populateListView(getApplicationContext());
aBar.setSelectedNavigationItem(position);
}

是的!我简直不敢相信解决方案一直这么简单。谢谢你! - Guy
3
onPageSelected 是用于 ListFragment 的。那么对于扩展 Fragment,有没有替代方法? - Dr.jacky

0
为了安全起见,您必须将listview数据保存在更高级别的Parent-Activity而不是fragments中。通过使构造函数private并创建一个getInstance方法来使您的MainActivity类成为singleton类,该方法返回您的`MainActivity`的唯一初始化实例。
这将使您能够将数据实例安全地保留,以免被重新初始化或丢失。然后,在片段的onResume中重新设置数据(从MainActivity获取),将其设置到您的listview adapter中,并从adapter实例调用notifyDataSetChanged()方法。
这将解决问题。

抱歉回复晚了。问题在于 onResume 片段没有执行。onResume 只执行一次,即使我在片段之间滑动,它也不再执行。为什么会这样? - Guy
因为它被缓存在你的“pager”中。 “pager”总是创建当前片段,可能还有左侧和右侧,以允许快速导航。 - Sami Eltamawy
您可以通过 pager.setOffScreenPageLimit(1); 控制预加载的片段数量,这将创建唯一的当前片段。 - Sami Eltamawy
似乎这个不起作用,我已经设置了 pager.setOffScreenPageLimit(1) 但是当应用程序打开时仍然会加载两个片段。 - Guy
@WhizW,你尝试使用FragmentStatePagerAdapter了吗?请参见http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html - suitianshi
这是您可以使用onPageSelected()代码的地方。只需检查当前片段是否为具有列表的片段(基于位置),然后调用您的更新方法即可。由于数据存储在较高级别,因此您只需要使UI反映发生的任何更改即可。 - Parnit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接