Android 如何从另一个片段更新片段的ListView?

Android 如何从另一个片段更新片段的ListView?,android,android-fragments,android-listview,Android,Android Fragments,Android Listview,在一个片段发生在另一个片段内部的事件之后,如何与列表片段的视图进行通信 在列表片段(片段A)中,我有一个方法来刷新列表视图。但是,我还需要在点击片段中的按钮后刷新它,该片段是另一个片段的子片段(片段b) 它类似于FragmentA(listFragment)|FragmentB(detailview) (片段C-B的子片段) 如何操作?您可以通过另一个片段的标签访问该片段: // find your fragment YourFragment f = (YourFragment) getSu

在一个
片段
发生在另一个
片段
内部的事件之后,如何与
列表片段的
视图
进行通信

列表片段
(片段A)中,我有一个方法来刷新
列表视图
。但是,我还需要在点击
片段
中的
按钮后刷新它,该片段是另一个
片段
的子片段(片段b)

它类似于
Fragment
A(listFragment)|
Fragment
B(detailview) (片段C-B的子片段)


如何操作?

您可以通过另一个
片段的标签访问该片段:

 // find your fragment
 YourFragment f = (YourFragment) getSupportFragmentManager().findFragmentByTag("yourFragTag");

 // update the list view
 f.updateListView(); 
片段的标记在附加到容器布局时设置:

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.frameBuy, YourFragment.newInstance(), "yourFragTag").commit();
因此,当您单击
按钮
时,通过标签找到要刷新的
片段
,然后调用刷新方法

如果您使用的是
ViewPager
,以下是获取
片段
标记的方法:

   /**
     * 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;
    }

您可以通过几个简单的步骤来完成:

  • 为组件创建侦听器接口,以侦听FragmentC中的按钮单击事件。例如:

    公共接口碎片按钮Listener{ public void onButtonClicked(); }

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

    公共类FragmentC扩展了Fragment{ 片段按钮Listener myListener; 公共无效注册表侦听器(FragmentCButtonListener侦听器){ myListener=监听器; } }

  • FragmentA应该实现FragmentCButtonListener接口,将自己注册为FragmentC的侦听器,并在收到FragmentC的回调时刷新列表视图。例如:

    公共类FragmentC扩展片段实现FragementCButtonListener{ 碎片C碎片C; public void onCreate(){ fragment=新的FragmentC(); fragment.registerListener(本文件); }

    }

  • 请注意,我假设FragmentA在样本中引用了FragmentC。如果不是,只需确保所有片段的容器类将自己注册为FragmentC的侦听器。容器类可以作为FragmentA在收到FragmentC的回调后更新listview。

    遵循以下步骤 我们有两个片段,分别称为
    AddFragment
    listframent
    ,在第一个片段上添加一个项目后,您希望更新的列表显示在列表片段上(这是什么魔法!!!)

    步骤1:在AddFragment的类级别上使用另一个guy(ListFragment)将要实现的方法创建侦听器接口,并创建接口类型变量

    public class AddFragment extends Fragment{
     //listener varriable
    
     //listener
      public interface OnCategoryAddedListener{
        public void refreshList();
    }
     private static OnCategoryAddedListener meAddListener;
    }
    
    步骤2:在同一AddFragment类的类级别上创建register方法并设置Listener变量

    public class AddFragment extends Fragment{
    
    
    public void registerListener(OnCategoryAddedListener listener)
    {
        meAddListener = listener;
    }
    }
    
    步骤3:当任何事件发生时,点击按钮或对着你的应用程序大喊大叫(这在android中被视为粗鲁事件:-)检查listener对象
    MeadListener
    变量并调用接口, 简而言之,莎士比亚的意思是:“
    ”对于那些实现了ye接口并将该方法带到你的班级庇护所的人,我将给予你我最大的特权和祝福……”

    ListFragment上的第4步实现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();
    }
    
    公共类ListFragment扩展片段实现AddFragment.onCategoryAddedListener{
    //请参阅AddFragment
    AddFragment AddFragment;
    //一旦片段在内存范围内,就实例化AddFragment
    //并使用AddFragment上下文注册侦听器,该上下文本质上实现OnCategoryAddedListener
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    categoryAddFragment=新categoryAddFragment();
    registerListener(this);
    }
    @凌驾
    已创建ActivityState上的公共无效(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    填充列表();
    }
    公共无效填充列表(){
    ArrayAdapter catArrayAdapter=新的ArrayAdapter(context,android.R.layout.simple_list_item_1,getItems());
    setListAdapter(catArrayAdapter);
    }
    //你可以依靠le接口方法刷新你的列表内容
    公共空刷新列表(){
    填充列表();
    }
    

    享受java魔力

    在我的例子中,我将对列表片段的引用存储在一个全局变量中,并在任何地方使用它,只要确保在重新创建列表时,该变量都会更新为对listView的新引用。最好的方法是使用包含活动来处理通信。首先在Fragm中创建一个接口ent,在活动中实现它,并从活动中找到要与之共享信息的片段。然后使用片段的引用调用该方法以更新列表。
    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();
    }