如何从另一个 Fragment 更新一个 Fragment 的 ListView?
Posted
技术标签:
【中文标题】如何从另一个 Fragment 更新一个 Fragment 的 ListView?【英文标题】:How to update the ListView of a Fragment from another Fragment? 【发布时间】:2014-04-18 15:06:04 【问题描述】:在Fragment
与另一个Fragment
发生事件后,我如何与ListFragment
进行listview
通信?
在ListFragment
(片段A)中,我有一种方法可以刷新ListView
。而且,我需要在Fragment
中单击Button
后刷新它,这是另一个Fragment
的子项(片段b)
就像Fragment
A (listFragment) | Fragment
B(详细)
(片段 C - B 的子片段)
我该怎么做?
【问题讨论】:
在我的例子中,我将 List Fragment 的引用存储在一个全局变量中并在任何地方使用它,只要确保在重新创建列表时使用对 listView 的新引用更新变量。跨度> 最好的方法是使用包含的 Activity 来处理通信。首先在你的 Fragment 中创建一个接口,在你的 Activity 中实现它,然后从你的 Activity 中找到你想要与之共享信息的 Fragment。然后使用片段的引用调用该方法来更新列表。 【参考方案1】:您可以通过标签访问另一个Fragment
:
// find your fragment
YourFragment f = (YourFragment) getSupportFragmentManager().findFragmentByTag("yourFragTag");
// update the list view
f.updateListView();
Fragment
的标签在 附加 到容器布局时设置:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.frameBuy, YourFragment.newInstance(), "yourFragTag").commit();
所以当你点击你的Button
时,通过它的标签找到你要刷新的Fragment
,然后调用你的刷新方法。
如果您使用的是ViewPager
,这是获取Fragments
标签的方法:
/**
* Gets the fragment tag of a fragment at a specific position in the viewpager.
*
* @param pos the pos
* @return the fragment tag
*/
public String getFragmentTag(int pos)
return "android:switcher:"+R.id.yourViewPagerId+":"+pos;
【讨论】:
【参考方案2】:您可以通过几个简单的步骤来做到这一点:
为组件创建一个监听接口,用于监听来自 FragmentC 的按钮点击事件。例如:
公共接口 FragmentCButtonListener 公共无效 onButtonClicked();
在 FragmentC 中添加一个方法以允许监听器注册。 FragmentC 将跟踪监听器,并在单击按钮后立即调用监听器回调。例如:
公共类 FragmentC 扩展 Fragment FragmentCButtonListener myListener; public void registerListener (FragmentCButtonListener listener) myListener = 监听器;
FragmentA 应该实现 FragmentCButtonListener 接口,将自己注册为 FragmentC 的监听器,并在收到 FragmentC 的回调时刷新列表视图。例如:
公共类 FragmentC 扩展 Fragment 实现 FragmentCButtonListener 片段 C 片段 C; 公共无效 onCreate() 片段=新片段C(); fragment.registerListener(this);
public void onButtonClicked()
//refresh the list view
请注意,我假设 FragmentA 在示例中引用了 FragmentC。如果没有,只需确保所有片段的容器类都将自己注册为 FragmentC 的侦听器。容器类可以作为 FragmentA 在收到 FragmentC 的回调后更新 listview。
【讨论】:
【参考方案3】:按照这些步骤
我们有两个名为AddFragment
和ListFragment
的片段,在第一个片段上添加一个项目后,您希望更新的列表显示在列表片段上(这是什么魔法!!!)。
第 1 步在 AddFragment 的类级别创建侦听器接口,使用将由其他人 (ListFragment) 实现的方法并创建接口类型变量
public class AddFragment extends Fragment
//listener varriable
//listener
public interface OnCategoryAddedListener
public void refreshList();
private static OnCategoryAddedListener meAddListener;
第2步在同一个AddFragment类的类级别上创建注册方法并设置监听器变量
public class AddFragment extends Fragment
public void registerListener(OnCategoryAddedListener listener)
meAddListener = listener;
步骤 3 在任何事件 cud 是按钮单击或对您的应用程序大喊大叫时(这在 android 中被认为是粗鲁的事件 :-))检查侦听器对象 meAddListener
变量并调用接口,
用莎士比亚的话来说就是“for thou who implement ye interface and brought the method within ur class shelter, I shall give u my utmost privilege and blessing to …. ”
Step 4 在 ListFragment 上实现 AddFragment 的接口,没有回头就去实现它的方法。在该方法中,您只需调用 abracadabra
来重新填充您的列表或任何可更新的 android 视图对象……然后您就完成了
public class ListFragment extends Fragment implements AddFragment.OnCattegoryAddedListener
//refer to AddFragment
AddFragment addFragment;
//once the fragment is within the memory scope u instantiate AddFragment
//and register listener with AddFragment context which inherently implement OnCategoryAddedListener
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
categoryAddFragment = new CategoryAddFragment();
categoryAddFragment.registerListener(this);
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
fillList();
public void fillList()
ArrayAdapter<String> catArrayAdapter = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1,getItems());
setListAdapter(catArrayAdapter);
//le interface method u can count on to refresh ur list content
public void refreshList()
fillList();
check this out for a little more 享受java魔法
【讨论】:
以上是关于如何从另一个 Fragment 更新一个 Fragment 的 ListView?的主要内容,如果未能解决你的问题,请参考以下文章
ViewPager+Fragment取消预加载(延迟加载)(转)