mardi 23 décembre 2014

ViewPager: Performing an Operation In Between Scrolls

Currently, the project in question is set up using a ViewPager which has an adapter capable of loading 4 different fragments. The last 3 Fragments are dependent upon the first fragment giving them a value (the SQL foreign key comes from the a value from the first item in the ViewPager).


My question is: how do I retrieve a value from the first Fragment's EditText, perform an SQL Operation and pass a value once the user attempts to "swipe" to the next tab?


Note, that I am trying to do this on swipe, and not via button. So far I have attempted to override OnPageScrolled, which yielded a null pointer when referring to the first fragment. I am assuming that the first fragment has been destroyed when I attempt to call it's hasPopulatedClassName() function


For Reference, the offending activity. Note the comment under OnPageScrolled



public class ActivityClassEdit extends FragmentActivity implements ViewPager.
private ClassEditPagerAdapter aPager;

//Views
private ViewPager vPager;

//Boolean telling us if we are good to move on to Criteria, People, or Links
private boolean mClassInserted;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_edit);
if(getIntent().hasExtra(CM.BKEY_PASSED_SEMESTERKEY)){
//Set the views
vPager=(ViewPager) findViewById(R.id.ace_pager);
//Instantiate the pager and set it

aPager=new ClassEditPagerAdapter(this, getIntent().getExtras().getLong(CM.BKEY_PASSED_SEMESTERKEY, -1));
vPager.setAdapter(aPager);
vPager.setOnPageChangeListener(this);


} else {
//TODO handle not having a semester key
}
}

//=============PageScrollListener==============
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

if(!mClassInserted) {
if (position == 1) {

//FragmentClassEdit fCE = (FragmentClassEdit) aPager.getRegisteredFragment(0);
FragmentClassEdit fCE = (FragmentClassEdit) aPager.getRegisteredFragment(0);
if (fCE.hasPopulatedClassName() == false) {
vPager.setCurrentItem(0);
Toast.makeText(this, getResources().getString(R.string.toast_typeInClassName), Toast.LENGTH_LONG).show();

} else {
//Save to shared Preferences, in case we have to delete on user cancellation
//null pointer here!!!
long mInsertedClassID= Long.getLong(fCE.insertClass());
getSharedPreferences(CM.SP, Activity.MODE_PRIVATE).edit().putLong(CM.SP_LASTINSERTEDCLASS, mInsertedClassID).apply();
aPager.setClassID(mInsertedClassID);
vPager.setCurrentItem(position);
}
}

} else {
vPager.setCurrentItem(position);
}
}


And here is the ViewPagerAdapter:



public class ClassEditPagerAdapter extends FragmentStatePagerAdapter{

private FragmentClassEdit fCE;
private Fragment fCrit;
private Fragment fLinks;
private Fragment fPeople;


private FragmentManager fragmentManager;
private String[] sTabText;


SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

private Context ctx;

private long semID;
private long cID;


public ClassEditPagerAdapter(FragmentActivity context, long semesterID){
super(context.getSupportFragmentManager());
fragmentManager=context.getSupportFragmentManager();
ctx= context;
sTabText = ctx.getResources().getStringArray(R.array.cepa_titles);
cID=-1;
semID=semesterID;
}


public void setClassID(long classID){
cID=classID;
}

@Override
public Fragment getItem(int fragID) {
switch (fragID) {
//FragClassEdit
case 0:

fCE = FragmentClassEdit.newInstance(semID);


return fCE;

//FragTypeEdit
case 1:


fCrit = FragmentCriteriaEdit.newInstance(cID);
return fCrit;




//FragPeople
case 2:
fPeople = FragmentPeopleEdit.newInstance(cID);
return fPeople;

//FragLinks
case 3:
fLinks = FragmentLinkEdit.newInstance(cID);
return fLinks;

}
return null;
}

@Override
public Object instantiateItem(ViewGroup container, int position){
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}

@Override
public int getCount() {
return 4;
}

@Override
public String getPageTitle(int position){
return sTabText[position];
}

}

Aucun commentaire:

Enregistrer un commentaire