【问题标题】:call method from fragment to fragment ( refresh adapter )从片段到片段调用方法(刷新适配器)
【发布时间】:2015-05-08 06:16:46
【问题描述】:

您好,我正在尝试调用位于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);

【问题讨论】:

  • 尝试在 Activity 级别实现 loadFiles() 而不是任何 Fragment 并在任何 Fragment 上使用它。

标签: java android load adapter


【解决方案1】:

我建议你这样做:

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

现在在 FragmentA 和 FragmentB 等你可以做

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

【讨论】:

  • 我做到了..没有任何改变..当我写这个 gridView.setAdapter(adapter); 时出现问题在片段 A 中它给了我错误.. 但我确实需要更新我的适配器的 grideView :/
  • 我发现问题只是调用 getActivity 而不是 this.v.getContext() .. 我也使用了你的答案,所以我会给你正确的答案。
  • 我没有改变,是的,你必须使用 getActivity() 而不是 this.v.getContext()
【解决方案2】:

通常你会希望一个 Fragment 与另一个 Fragment 进行通信,因为 基于用户事件更改内容的示例。全部 片段到片段的通信是通过关联的 活动。两个 Fragment 永远不应该直接通信。

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

【讨论】:

    【解决方案3】:

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

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

    如果它不存在并且您必须从 Fragment1 实例化它,那么您的策略可能不正确,您应该将代码放入您的活动中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多