如何从另一个 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) | FragmentB(详细) (片段 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】:

按照这些步骤 我们有两个名为AddFragmentListFragment的片段,在第一个片段上添加一个项目后,您希望更新的列表显示在列表片段上(这是什么魔法!!!)。

第 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出前一个片段正在使用导航组件

Fragment中无法选择GridView项

ViewPager+Fragment取消预加载(延迟加载)(转)

如何从另一个片段访问片段对象

Fragment中的ViewPager的Fragment添加子Fragment要放在onAttach中添加

如何在一个fragment中更新另一个fragment