从片段到片段的调用方法(刷新适配器)
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.
你好,我正在尝试调用位于 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.