1

My goal is to delete a fragment from a ViewPager upon user button click. Populating the ViewPager works fine, but when I try to delete it, I get an error indicating a null reference. I incorporated Remove Fragment Page from ViewPager in Android

In my fragment to be deleted I have:

Button delete = (Button) getActivity().findViewById(R.id.dont_show_button_1);
    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            db.deletePerson(count); // SQLiteDatabase, works fine
            displayActivity.removeCurrentFragment(count-1);

        }
    });

DisplayActivity is as follows:

public class DisplayActivity extends FragmentActivity {

ViewPager viewPager;
PagerAdapter pagerAdapter;
String TAG = "DisplayActivity";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.db_layout);

    viewPager = (ViewPager) findViewById(R.id.pager);

    pagerAdapter = new PagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
}

public void removeCurrentFragment(int position){
    pagerAdapter.fragmentArrayList.remove(position);
    pagerAdapter.notifyChangeInPosition(1);
    pagerAdapter.notifyDataSetChanged();
    Log.e(TAG, "in removeCurrentFragment");
}

}

PagerAdapter

public class PagerAdapter extends FragmentPagerAdapter {

long baseId = 0;
public static List<Fragment> fragmentArrayList = new ArrayList<Fragment>();

public PagerAdapter(FragmentManager fm){
    super(fm);
    fragmentArrayList.add(new FragmentOne());
    fragmentArrayList.add(new FragmentTwo());
    fragmentArrayList.add(new FragmentThree());
}
@Override
public Fragment getItem(int position) {
    return fragmentArrayList.get(position);
}

@Override
public int getCount() {
    return fragmentArrayList.size();
}

@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

@Override
public long getItemId(int position) {
    // give an ID different from position when position has been changed
    return baseId + position;
}

/**
 * Notify that the position of a fragment has been changed.
 * Create a new ID for each position to force recreation of the fragment
 * @param n number of items which have been changed
 */
public void notifyChangeInPosition(int n) {
    // shift the ID returned by getItemId outside the range of all previous fragments
    baseId += getCount() + n;
}

}

This is the error:

java.lang.NullPointerException: Attempt to invoke virtual method 'void .DisplayActivity.removeCurrentFragment(int)' on a null object reference

Triggered from the fragment

Edit:

public class FragmentOne extends Fragment {

DatabaseHelper db;
WebView mWebView;
DisplayActivity displayActivity;
int count = 1;

This is how I get reference from displayActivity, is this the wrong way to get a reference of it?

Community
  • 1
  • 1
Jasmine Rain
  • 419
  • 2
  • 6
  • 17
  • Where do you get a reference to your `DisplayActivity`? – 0xDEADC0DE Feb 22 '16 at 08:11
  • It seems that reference of the DisplayActivity is null. –  Feb 22 '16 at 09:11
  • @Viren Please see edit – Jasmine Rain Feb 22 '16 at 15:53
  • @0xDEADC0DE Please refer to my edit. – Jasmine Rain Feb 22 '16 at 15:53
  • @JasmineRain, I see now where it is declared, but you got to have `displayActivity = getActivity();` or something like that. If not, you're `NullPointerException` is thrown because of this line `displayActivity.removeCurrentFragment(count-1);` – 0xDEADC0DE Feb 22 '16 at 16:10
  • 1
    @JasmineRain You will have to cast it to `DisplayActivity` and you have to be sure that `getActivity()` will return an instance of that, otherwise you get a `ClassCastException`. That occurs when this `FragmentOne` is used in an `Activity` that is not an instance of `DisplayActivity` – 0xDEADC0DE Feb 22 '16 at 16:16

1 Answers1

0
if (count > 0) {
    displayActivity.removeCurrentFragment(count - 1);
}
Ziem
  • 6,579
  • 8
  • 53
  • 86
sasikumar
  • 12,540
  • 3
  • 28
  • 48