【问题标题】:How to update the ListView of a Fragment from another Fragment?如何从另一个 Fragment 更新一个 Fragment 的 ListView?
【发布时间】: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。然后使用片段的引用调用该方法来更新列表。

标签: android android-fragments android-listview


【解决方案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】:

    您可以通过几个简单的步骤来做到这一点:

    1. 为组件创建一个监听接口,用于监听来自 FragmentC 的按钮点击事件。例如:

      公共接口 FragmentCButtonListener { 公共无效 onButtonClicked(); }

    2. 在 FragmentC 中添加一个方法以允许监听器注册。 FragmentC 将跟踪监听器,并在单击按钮后立即调用监听器回调。例如:

      公共类 FragmentC 扩展 Fragment { FragmentCButtonListener myListener; public void registerListener (FragmentCButtonListener listener) { myListener = 监听器; } }

    3. 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魔法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-06
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多