2015-05-08 2 views
-2

Привет, я пытаюсь вызвать эту функцию loadFiles(), которая находится в fragmentB, и я хочу позвонить ей из FragmentA, поэтому я могу обновить свои GridView для своих изображений и видео.метод вызова из фрагмента в фрагмент (refresh adapter)

Я получаю эту ошибку из того же метода

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); 
+0

попробуйте использовать интерфейс – penguin

+0

Попробуйте реализовать loadFiles() на уровне активности вместо любого фрагмента и использовать его на любом фрагменте. –

ответ

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); 
+0

Я сделал это .. ничего не изменилось .. проблема возникает, когда я пишу этот gridView.setAdapter (адаптер); в Fragment A это дает мне ошибку .. но мне нужно, чтобы я мог обновить свой grideView моего адаптера:/ – boudi

+0

Я нашел проблему, просто вызвав getActivity вместо this.v.getContext() .. Я использовал ваш ответьте также, поэтому я дам вам правильный ответ. – boudi

+0

Я не изменил это да, вы должны использовать 'getActivity()' вместо 'this.v.getContext()' – Rustam

0

Часто вы хотите один фрагмент общаться с другой, например, чтобы изменить содержание, основанное на события пользователя. Все Связь фрагментов с фрагментами осуществляется через связанную с ней деятельность . Два фрагмента никогда не должны связываться напрямую.

См. Ссылку here, вы найдете все необходимые данные; также вы можете скачать zip-файл, содержащий пример приложения.

0

Если вы хотите, чтобы вызвать метод фрагмент, потому что фрагмент существует , так что вы можете его найти и назвать:

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

Если это не существует, и вы должны его создать om Fragment1, тогда, возможно, ваша стратегия неверна, и вы должны поместить свой код в свою деятельность.

Смежные вопросы