Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ViewPager Activity to notify a Fragment of a specific event

Tags:

I have a ViewPager and it is using a FragmentAdapter in order to display several fragments of the same kind. Although these Fragments are basically instantiated from the same class, they are using a ListView to display different information. (Obviously the ListView is being poulated by an ArrayAdapter.)
A background service is also running and is constantly receiving data from the Internet. I want to be able to update a specific Fragment in the ViewPager when my background service has notified me of a specific event.
How can I do that? A code snippet would be hugely appreciated!

(By the way, I have saw this similar question but I have no idea how to use their suggestion!)

To make it all more simple: My activity with the ViewPager:
[Fragment 0] [Fragment 1] [Fragment 2]

The background service tells me (via a broadcast) to update the ListView in Fragment 1.

EDIT: Here are sample codes:

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

Now the fragments is defined like this:

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  } 

As I am using a FragmentPagerAdapter I don't see how I can set the tag of each fragment! (Obviously, I am not using transactions to add the Fragments!)

EDIT 2: I would like to know whether what I'm doing, is the correct way to handle what I want to do... Any other solution is also welcome!

like image 460
Maghoumi Avatar asked Jan 21 '12 21:01

Maghoumi


People also ask

How do you know when a fragment becomes visible?

fragment:fragment:1.1. 0 you can just use onPause() and onResume() to determine which fragment is currently visible for the user. onResume() is called when the fragment became visible and onPause when it stops to be visible. To enable this behavior in the first ViewPager you have to pass FragmentPagerAdapter.

Can we add activity in ViewPager?

You can't use ViewPager to swipe between Activities . You need to convert each of you five Activities into Fragments , then combine everything in one FragmentActivity with the Adapter you use with ViewPager .

Is ViewPager deprecated?

This function is deprecated.


1 Answers

Try this,

Register a broadcast receiver in all your fragments... like this

create a class which extends a broadcast receiver in all the classes, for eg:

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

and register this receiver in you fragment's onCreate ...

for eg. getActivity().registerReceiver(new FragmentReceiver1(), new IntentFilter("fragmentupdater"));

Now assign a unique id to each of you fragment like 1 for Fragment1, 2 for Fragment2 and likewise

now whenever you want to pass any data and update any of the fragment just send a broadcast with the data in intent and "fragmentupdater" as the intent-filter...

For eg:

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

Now each of your fragment will receive the data but you can verify if the data if for the same fragment by the unique id we passed in it in the onReceive function..., the intent which you get, is the intent we passed above

like image 91
King RV Avatar answered Oct 09 '22 10:10

King RV