Intereting Posts
Почему мой StringRequest всегда работает с методом onErrorResponse? Можно ли использовать общие предпочтения? Добавить маркер в касание местоположения с помощью карты google в android Получить Bitmap из ImageView, загруженного Picasso Как обнаружить превышение в Android ListView? Проведите по экрану для RecyclerView Кнопка «Назад» и последняя активность Android EditText Gmail нравится в поле Видео для Android HTML5 – работает при нажатии на воспроизведение, но не video.play () Создайте пользовательский диалог с списком переключателей Android: как я могу напечатать переменную на консоли eclipse Избавление от градиента в верхней части Activity (Android) Как переносить платные Android-приложения из одной учетной записи google в другую учетную запись google USB-связь между Android (режим аксессуаров) и ПК с ОС Windows (хост) Распознавание лица opencv возвращает одно и то же имя из БД для неизвестных пользователей

Активность ViewPager для уведомления фрагмента определенного события

У меня есть ViewPager и он использует FragmentAdapter для отображения нескольких фрагментов одного и того же типа. Хотя эти фрагменты в основном создаются из одного класса, они используют ListView для отображения различной информации. (Очевидно, что ListView перенасыщен ArrayAdapter .)
Фоновая служба также работает и постоянно получает данные из Интернета. Я хочу иметь возможность обновлять определенный фрагмент в ViewPager когда мой фоновый сервис уведомил меня об определенном событии.
Как я могу это сделать? Фрагмент кода был бы чрезвычайно оценен!

(Кстати, я видел этот похожий вопрос, но я понятия не имею, как использовать их предложение!)

Чтобы сделать его более простым: моя активность с ViewPager:
[Фрагмент 0] [Фрагмент 1] [Фрагмент 2]

Фоновая служба сообщает мне (через трансляцию) обновлять ListView во фрагменте 1 .

EDIT: Вот примеры кода:

 public class ChatWindowPager extends FragmentActivity { private ViewPager mViewPager = null; private ChatFragmentAdapter mAdapter = null; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat_window_pager); this.mViewPager = (ViewPager) findViewById(R.id.chatPager); this.mAdapter = new ChatFragmentAdapter(getSupportFragmentManager()); this.mViewPager.setAdapter(this.mAdapter); . . . } class ChatFragmentAdapter extends FragmentPagerAdapter implements ViewProvider { public ChatFragmentAdapter(final FragmentManager fm) { super(fm); } @Override public Fragment getItem(final int arg0) { String friendId = ..... // Some initializations ChatWindowFragment f = ChatWindowFragment.newInstance(friendId); return f; } @Override public int getCount() { ... } @Override public View getView(final int position) { View v = getLayoutInflater().inflate(R.layout.tab_holder, null); . . . return v; } } } 

Теперь фрагменты определяются следующим образом:

 public class ChatWindowFragment extends Fragment { public String friendId; private ListView lv; public static ChatWindowFragment newInstance(final String friendId) { ChatWindowFragment chatWindowFragment = new ChatWindowFragment(); Bundle bundle = new Bundle(); bundle.putString("friendId", friendId); chatWindowFragment.setArguments(bundle); return chatWindowFragment; } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.friendId = getArguments().getString("friendId"); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View v = inflater.inflate(R.layout.chat_window, container, false); this.friendId = getArguments().getString("friendId"); . . . return v; } //The rest of the class } 

Поскольку я использую FragmentPagerAdapter я не вижу, как я могу установить тег каждого фрагмента! (Очевидно, что я не использую транзакции для добавления фрагментов!)

EDIT 2: Я хотел бы знать, что я делаю, это правильный способ справиться с тем, что я хочу … Любое другое решение также приветствуется!

Solutions Collecting From Web of "Активность ViewPager для уведомления фрагмента определенного события"

Попробуй это,

Зарегистрируйте радиоприемник во всех ваших фрагментах … вот так

Создать класс, который расширяет широковещательный приемник во всех классах, например:

 public class FragmentReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } } 

И зарегистрируйте этот ресивер в вашем фрагменте onCreate …

Например. getActivity().registerReceiver(new FragmentReceiver1(), new IntentFilter("fragmentupdater"));

Теперь назначьте уникальный идентификатор для каждого из фрагментов, например 1 для Fragment1, 2 для Fragment2 и аналогично

Теперь, когда вы хотите передать какие-либо данные и обновить любой фрагмент, просто отправьте широковещательную рассылку с данными в намерениях и «fragmentupdater» в качестве фильтра намерений …

Например:

 Intent data = new Intent("fragmentupdater"); data.putString("key","data"); data.putInt("fragmentno",1); // Pass the unique id of fragment we talked abt earlier activity.sendBroadcast(data); 

Теперь каждый ваш фрагмент получит данные, но вы можете проверить, являются ли данные, если для одного и того же фрагмента уникальным идентификатором, который мы передали в нем в функции onReceive …, целью, которое вы получаете, является намерение, которое мы прошли выше

Вы пробовали FragmentManager.findFragmentByTag()

 FragmentManager manager = getSupportedFragmentManager(); //with support package, else //FragmentManager manager = getFragmentManager() Fragment fragment = manager.findFragmentByTag("Tag You Created the Fragment"); if (fragment instanceof Fragment1){ Fragment1 fr = (Fragment1)fragment fr.updateData(DATA) //or any method of your choice } 

EDIT: Я читал внимательно! instanceOf будет отбрасывать Fragment в ваш класс фрагментов. Это вы, который предложил Fragment1 как имя для простоты. Кроме того, вы не предоставили никаких источников, чтобы помочь нам. Это правда, что вы не можете установить тег Fragment , но почему вы думаете, что можете получить его тег? Обычно Fragment добавляется через FragmentManagers например

 FragmentManager manager = getSupportedFragmnentManager() FragmentTransaction transaction = manager.beginTransaction(); transaction.add(int containerViewId, Fragment fragment, String tag); // or transaction.add(Fragment fragment, String tag) // ...other transactions transaction.commit() 

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

 Fragment fragment = mAdapter.getItem(0) // 0||1||2 

Вам следует подумать о том, чтобы прочитать документы (например, о FragmenPagerAdapter ) и опубликовать исходный код, поэтому нам не нужно угадывать, что вам нужно.

У меня была такая же проблема, но я исправил ее с помощью localBroadcastReceiver следующим образом:

Создайте ресивер в своей деятельности и зарегистрируйте его:

  /** * ****************************** * Receiver to process the message * ******************************* */ private BroadcastReceiver onNotice = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //You can send any extra data if you need like this final int type = intent.getIntExtra("fragment.data", -1); Log.d(tag, "main class: " + type); //also refresh your fragment like this mViewPager.getViewPager().getAdapter().notifyDataSetChanged(); } }; @Override protected void onResume() { super.onResume(); //Register a localbroadCast with the your filter IntentFilter thinaireFilter = new IntentFilter("your.filter"); LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, thinaireFilter); } 

Не забудьте удалить LocalBroadCast

 //remove the LocalBroadCast when no need it @Override protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); } @Override protected void onDestroy() { super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); } 

Отправьте свою трансляцию из любого места, где вы хотите. Адаптеры, службы и т. Д.

 Intent sendBroadCastData = new Intent("your.filter"); sendBroadCastData.putExtra("fragment.data", myData); LocalBroadcastManager.getInstance(context).sendBroadcast(sendBroadCastData); 

Надеюсь, это поможет другим.

Я недостаточно знаю, что вы делаете, но похоже, что вам нужно использовать шаблон Observer, Callbacks или Listeners. Не может ли ваш фрагмент сделать что-то вроде:

 myservice.addMyEventListener(myFragInstance); 

И тогда вы можете быть «уведомлены о конкретном событии».

Просто посмотрите на этот ответ https://stackoverflow.com/a/16388650

Он использовал yourAdapter.notifyDataSetChanged() который является предопределенным методом. Проверьте ссылку, чтобы узнать, как это делается.

Edit: Когда ваша AsyncTask выполнена, вы должны сделать что-то вроде этого метода onPostExecute:

 ResultFragment resultFrag = (ResultFragment) getSupportFragmentManager() .findFragmentByTag("FragToRefresh"); if (resultFrag != null) { resultFrag.refreshData(refreshedArray); } 

И в вашем ResultFragment вам нужно иметь метод refreshData, который выглядит примерно так:

 public void refreshData(ArrayList<YourObject> data) { yourArray = new ArrayList<YourObject>(data); yourAdapter.notifyDataSetChanged(); }