2014-11-30 7 views
2

Я уже некоторое время пытался (и здесь здесь искать), чтобы помочь мне обновить listView в моем MainFragment, когда кнопка нажата в другом фрагменте. Может ли мне объяснить, как заставить его работать?Вызов метода из одного фрагмента из другого

Вот MainFragment с функцией (я исключил другие функции, так как я не вижу, как они способствуют):

public class MainFragment extends Fragment { 
public void otherList() { 
    SQLite db = new SQLite(getActivity()); 
    db.open(); 
    Calendar sCalendar = Calendar.getInstance(); 
    String day = sCalendar.getDisplayName(Calendar.DAY_OF_WEEK, 
      Calendar.LONG, Locale.ENGLISH); 
    Cursor c = db.getAllRecords(day); 
    Calendar cal = Calendar.getInstance(); 
    int hour = cal.get(Calendar.HOUR_OF_DAY); 
    arrayOfBars.clear(); 
    if (c.moveToFirst()) { 
     do { 
      String country = c.getString(0); 
      String city = c.getString(1); 
      String bar = c.getString(2); 
      String timeStart = c.getString(3); 

      String[] h = timeStart.split(":"); 
      int times = Integer.parseInt(h[0]); 

      String timeEnd = c.getString(4); 
      String[] h2 = timeEnd.split(":"); 
      int timee = Integer.parseInt(h2[0]); 

      String placeLaLo = c.getString(5); 
      String description = c.getString(6); 
      String likes = c.getString(7); 
      String offer = c.getString(8); 

      if (hour < (times + 1) || hour < (timee)) { 
       getPrefs = PreferenceManager 
         .getDefaultSharedPreferences(MainFragment.this 
           .getActivity()); 
       boolean lay = getPrefs.getBoolean("boolean", false); 
       if (lay == true) { 
        while (times < timee) { 
         timeStart = times + ":" + h[1]; 
         times++; 
         timeEnd = times + ":" + h2[1]; 
         arrayOfBars.add(new BarObject(country, city, bar, 
           timeStart, timeEnd, placeLaLo, description, 
           likes, offer, bar)); 
        } 
       } else { 
        arrayOfBars.add(new BarObject(country, city, bar, 
          timeStart, timeEnd, placeLaLo, description, 
          likes, offer, bar)); 
       } 
      } 

     } while (c.moveToNext()); 

     Collections.sort(arrayOfBars, new BarObject.CompST()); 

     lv2.setAdapter(null); 
     adapter = new BarAdapter(getActivity(), arrayOfBars); 
     lv2.setAdapter(adapter); 
    } else { 
     Toast.makeText(getActivity(), "No database found", 
       Toast.LENGTH_LONG).show(); 
    } 
    db.close(); 
} 

}

А вот другой фрагмент:

public class SocialMedia extends Fragment { 
ImageButton facebook, twitter, layoutS; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.social_media, container, false); 
    layoutS = (ImageButton) view.findViewById(R.id.ibLayout); 

    layoutS.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SharedPreferences getPrefs = PreferenceManager 
        .getDefaultSharedPreferences(SocialMedia.this 
          .getActivity()); 
      boolean lay = getPrefs.getBoolean("boolean", false); 
      SharedPreferences.Editor e = getPrefs.edit(); 
      lay = !lay; 
      e.putBoolean("boolean", lay); 
      e.commit(); 
          //Here I want to call otherList() from MainFragment 
     } 
    }); 
    return view; 
} 

}

+0

'FragmentManager fm = getFragmentManager(); \t \t \t \t MainFragment fragem = (MainFragment) fm.findFragmentById (R.id.main_fragment); \t \t \t \t fragem.otherList(); ', работал для меня –

ответ

4
FragmentManager fm = getFragmentManager(); 
MainFragment fragm = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
fragm.otherList(); 

Этот код работает лучше для меня. И кажется довольно простым

+0

сэкономил мое время. – pratz9999

+0

Работа в фоновом режиме, потратила мое время – AshuKingSharma

0

Чтобы вызвать метод из другого объекта (фрагмент - это объект) y ou нужно иметь ссылку на этот объект. Поэтому, если вы хотите позвонить MainFragment#otherList() с примера SocialMedia, SocialMedia нуждается в ссылке на MainFragment.

Например:

public class SocialMedia { 

    private MainFragment mainFragment = null; 

    public void setMainFragment(final MainFragment mainFragment) { 
     this.mainFragment = mainFragment 
    } 
} 

Затем вы можете использовать this.mainFragment.otherList().

+0

Я думаю, что это не является хорошим решением, чтобы передать' Fragment' другому 'Fragment' –

+0

Не работает - это как раз разбитого мое приложение. Но тем временем я нашел простое решение. –

+0

@KManos Он разбился probaby, потому что вы не установили фрагмент, и он равен нулю. – m0skit0

2

для этого необходимо использовать interface. определите interface в классе OtherFragment и реализуйте это в своем MainActivity и определите метод public в вашем MainFragment для обновления ListView и позвоните этому методу с вашего MainActivity. вот пример:

public Class OtherFragment extends Fragment implements OnClickListener { 

private Communicator communicator; 

    ... 

public void setCommunicator(Communicator communicator) { 
    this.communicator = communicator; 
} 

@Override 
public void onClick(View v) { 
    communicator.clicked(); 
} 

    public interface Communicator { 
     public void clicked(); 
    } 
} 

и в вашем MainActivity:

public class MainActivity extends Activity implements OtherFragment.Communicator { 

    MainFragment mainFragment; 

    @Override 
    protected void onCreate(Bundle b) { 
     ... 
     OtherFragment otherFragment = new OtherFragment(); 
     otherFragment.setCommunicator(this); 
     ... 
    } 

    ... 

    @Override 
    public void clicked() { 
    mainFragment.updateList(); 
    } 
} 

и в вашем MainFragment:

public class MainFragment extends Fragment { 

    ... 

    public void updateList() { 
     // update list 
    } 
} 
+0

, честно говоря, я не буду пытаться его реализовать, так как в то же время я нашел простое решение. Спасибо за предоставленное время. –

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