I have a simple viewPager with two fragments. Each fragment contains a TextView. I would like to be able to update the text of the current textView displayed from the activity.
Activity :
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ArrayList<Fragment> fragments = new ArrayList<Fragment>();
fragments.add(Fragment.instantiate(this, Live.class.getName()));
fragments.add(Fragment.instantiate(this, Hit.class.getName()));
this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments);
ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
pager.setAdapter(pagerAdapter);
}
}
Adapter :
public class MyPagerAdapter extends FragmentPagerAdapter {
private final ArrayList<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments)
{
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
Fragment :
public class Live extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.live, container,false);
}
}
XML Fragment :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:text="First Fragment"
android:id="@+id/status"/>
</LinearLayout>
Each fragment have a TextView with the id "status".
Updating the text view in onCreateView
works. But how can i update the textView from anywhere in the activity ?
I have tried this without succes :
Fragment :
public class Live extends Fragment {
public TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.live, container,false);
tv = (TextView) view.findViewById(R.id.status);
return view;
}
}
Activity :
@Override
protected void onResume() {
super.onResume();
Live frag = (Live) pagerAdapter.getItem(0);
frag.tv.setText("Test 2");
}
But it gives me a nullPointerException on tv
, probably because the fragment is not yet inflated.
I already read the following questions without success :
You can create some update () method that will update your Fragment (fragment will handle updates itself) public interface Updateable { public void update (); } public class MyFragment extends Fragment implements Updateable { ... public void update () { // do your stuff } } And in FragmentPagerAdapter you'll do something like this:
A FragmentManager manages Fragments in Android, specifically, it handles transactions between fragments. A transaction is a way to add, replace, or remove fragments. getPageTitle (int pos): (optional) Similar to getItem () this methods returns the title of the page at index pos.
Steps for implementing viewpager: Adding the ViewPager widget to the XML layout (usually the main_layout). Creating an Adapter by extending the FragmentPagerAdapter or FragmentStatePagerAdapter class. An adapter populates the pages inside the Viewpager.
In your MyPagerAdapter class, Android calls getItem (...) only if it wants to create new Fragments. So it's problematic to use references there instead you should instatiate the fragments.
In your MyPagerAdapter
class, Android calls getItem(...)
only if it wants to create new Fragments. So it's problematic to use references there instead you should instatiate the fragments.
Check this Answer support-fragmentpageradapter-holds-reference-to-old-fragments
I solved this issue like this, create the adapter like this
package com.yubraj.sample.adapter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import com.yubaraj.sample.activities.RashiFragment;
import java.util.List;
public class PageSliderAdapter extends FragmentStatePagerAdapter {
static String[] titleList = new String[] { "today",
"this month", "this year" };
List<String> rashi;
// private static String TAG = "pagerscreenslider";
public PageSliderAdapter(FragmentManager fm, List<String> rashiList) {
super(fm);
this.rashi = rashiList;
}
public void updateData(List<String> rashisList){
rashi.clear();
this.rashi = rashisList;
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new RashiFragment();
Bundle bundle = new Bundle();
bundle.putString("RASHI", rashi.get(position));
bundle.putInt("RASHI_TYPE", position);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return titleList.length;
}
@Override
public String getPageTitle(int position) {
return titleList[position];
}
}
Then from Your activity
List<String> rashiCollection = getJSONFromDb(Dates);
adapter.updateData(rashiCollection);
@Override
public int getItemPosition(Object object) {
XXXFragment fragment = (XXXFragment) object;
if(…condition){
fragment.refresh(…);
}
return super.getItemPosition(object);
}
override the above. when you call notifyDataSetChanged(), the above method's triggered. do your refresh as you can.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With