从片段到片段的调用方法(刷新适配器)

call method from fragment to fragment ( refresh adapter )

你好,我正在尝试调用位于 fragmentB 的函数 loadFiles(),我想从 FragmentA 调用它,这样我就可以刷新我的 GridView对于我的图片和视频。

我用同样的方法得到这个错误

FATAL EXCEPTION: main
    java.lang.NullPointerException

我在 FragmentB 中的方法:

  public void loadFiles(){
        gridView = (GridView) this.v.findViewById(R.id.grid);
        File f = new File(home);
        if (f.exists()){
            String [] media = f.list();
            ArrayList<String> files = new ArrayList<>();
            for (int i=0; i<media.length;i++){
                if (media[i].endsWith(".jpg")||
                        media[i].endsWith(".png")||
                        media[i].endsWith(".JPEG")||
                        media[i].endsWith(".3gp")||
                        media[i].endsWith(".mp4")||
                        media[i].endsWith(".mov")){
                    files.add(media[i]);
                }

                if (i==media.length-1){
                    GridAdapter adapter = new GridAdapter(this.v.getContext(), files, gridView);
                    adapter.notifyDataSetChanged();
                    gridView.setAdapter(adapter);
                }
            }
        }
    }

我如何在 FragmentA 中调用它:

FragmentB b = new FragmentB();
b.loadFiles();

我认为问题是因为这条线,但我已经尝试了一切,但没有运气:(

GridAdapter adapter = new GridAdapter(this.v.getContext(), files, gridView);

Often you will want one Fragment to communicate with another, for example to change the content based on a user event. All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.

查看此 link here,您将找到所有必需的详细信息;您也可以下载包含示例应用程序的 zip 文件。

我建议你这样做:

 public class Utils{
 public static ArrayList<String> loadFiles(){
         File f = new File(home);
        if (f.exists()){
            String [] media = f.list();
            ArrayList<String> files = new ArrayList<>();
            for (int i=0; i<media.length;i++){
                if (media[i].endsWith(".jpg")||
                        media[i].endsWith(".png")||
                        media[i].endsWith(".JPEG")||
                        media[i].endsWith(".3gp")||
                        media[i].endsWith(".mp4")||
                        media[i].endsWith(".mov")){
                    files.add(media[i]);
                }
            }
            return files;
        }
    }
}

现在在 FragmentS 和 Fragment 等中你可以做

  gridView = (GridView) this.v.findViewById(R.id.grid);
     GridAdapter adapter = new GridAdapter(this.v.getContext(), Utils.loadFiles(), gridView);     
       gridView.setAdapter(adapter);

如果你想调用一个片段方法是因为那个片段存在,那么你可以找到并调用它:

Fragment2 myFragment = (MyFragment2) getFragmentManager().findFragmentByTag("TAG_NAME");
myFragment.method();

如果它不存在并且你必须从 Fragment1 实例化它,那么你的策略可能不正确,你应该将你的代码放在你的 activity.