android - studio - ¿Cómo actualizar el contenido del fragmento de la actividad(viewpager)?
viewpager not fragments (3)
Tengo un viewPager simple con dos fragmentos. Cada fragmento contiene un TextView. Me gustaría poder actualizar el texto del textView actual que se muestra de la actividad.
Actividad :
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);
}
}
Adaptador:
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();
}
}
Fragmento :
public class Live extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.live, container,false);
}
}
Fragmento XML:
<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>
Cada fragmento tiene un TextView con el id "estado". La actualización de la vista de texto en onCreateView
funciona. Pero, ¿cómo puedo actualizar textView desde cualquier lugar de la actividad?
He intentado esto sin éxito:
Fragmento :
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;
}
}
Actividad :
@Override
protected void onResume() {
super.onResume();
Live frag = (Live) pagerAdapter.getItem(0);
frag.tv.setText("Test 2");
}
Pero me da una nullPointerException en la tv
, probablemente porque el fragmento aún no está inflado.
Ya leí las siguientes preguntas sin éxito:
En su clase MyPagerAdapter
, Android llama a getItem(...)
solo si desea crear nuevos Fragmentos. Por lo tanto, es problemático usar referencias allí, en lugar de eso, debes instigar los fragmentos.
Marque esta respuesta support-fragmentpageradapter-holds-reference-to-old-fragments
Resolví este problema como este, creo el adaptador así
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];
}
}
Luego de tu actividad
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);
}
anular lo anterior. cuando llama a notificationDataSetChanged (), se activa el método anterior. haz tu actualización como puedas.