Search code examples
androidandroid-fragmentsandroid-studioandroid-gridview

Problems with Gridview in Fragment


I'm having a nullpointer exception with my adapter in the fragment i use the gridview. When the app starts the Pager loads the fragment into the tab but the adapter sends null and the app stops

Here u can see my mainactivity:

public class MainLayout extends AppCompatActivity  {
ViewPager pager;
TabLayout tabLayout;

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

    pager = (ViewPager) findViewById(R.id.view_pager);
    tabLayout = (TabLayout) findViewById(R.id.tab_layout);

    // Fragment manager to add fragment in viewpager we will pass object of Fragment manager to adpater class.
    FragmentManager manager = getSupportFragmentManager();

    //object of com.example.babus.konektamos.PagerAdapter passing fragment manager object as a parameter of constructor of com.example.babus.konektamos.PagerAdapter class.
    PagerAdapter adapter = new PagerAdapter(manager);

    //set Adapter to view pager
    pager.setAdapter(adapter);

    //set tablayout with viewpager
    tabLayout.setupWithViewPager(pager);

    // adding functionality to tab and viewpager to manage each other when a page is changed or when a tab is selected
    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    //Setting tabs from adpater
    tabLayout.setTabsFromPagerAdapter(adapter);

 }


//inicio menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.tuto:
            Intent i = new Intent(MainLayout.this, Tutorial.class);
            finish();
            startActivity(i);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

 }
 //final menu







//modificamos el boton atras para que no nos devuelva al wizzard
@Override
public void onBackPressed(){

    finish();
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}
}

Here u can see my Page adapter:

public class PagerAdapter extends FragmentStatePagerAdapter {
public PagerAdapter(FragmentManager fm) {
    super(fm);
}
@Override
public Fragment getItem(int position) {

    Fragment frag = null;
    switch (position){
        case 0:
            frag = new OfertasFragment();
            break;
        case 1:
            frag = new NegociosFragment();
            break;
        case 2:
            frag = new TarjetaFragment();
            break;
    }
    return frag;
}

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

@Override
public CharSequence getPageTitle(int position) {
    String title = " ";
    switch (position){
        case 0:
            title = "Ofertas";
            break;
        case 1:
            title = "Negocios";
            break;
        case 2:
            title = "Tarjeta";
            break;
    }

    return title;
}
}

This is the xml of the fragment:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.babus.konektamos.OfertasFragment">

<!-- TODO: Update blank fragment layout -->
<GridView
    android:id="@+id/grid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="120dp"
    android:horizontalSpacing="@dimen/espacio_grilla"
    android:numColumns="2"
    android:padding="@dimen/espacio_grilla"
    android:verticalSpacing="@dimen/espacio_grilla" />

And here u can see my fragment:

public class OfertasFragment extends Fragment implements AdapterView.OnItemClickListener{
private GridView gridView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //inicio gridview
    gridView = (GridView) this.getActivity().findViewById(R.id.grid);
    gridView.setAdapter(new AdaptadorDeCupones(this.getActivity()));
    gridView.setOnItemClickListener(this);
    //fin gridview
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_ofertas,container,false);
    return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}




//Inicio detalle cupones
//@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    cupones item = (cupones) parent.getItemAtPosition(position);

    Intent intent = new Intent(this.getActivity(), ActividadDetalle.class);
    intent.putExtra(ActividadDetalle.EXTRA_PARAM_ID, item.getId());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        ActivityOptionsCompat activityOptions =
                ActivityOptionsCompat.makeSceneTransitionAnimation(
                        this.getActivity(),
                        new Pair<View, String>(view.findViewById(R.id.imagen_cupon),
                                ActividadDetalle.VIEW_NAME_HEADER_IMAGE)
                );

        ActivityCompat.startActivity(this.getActivity(), intent, activityOptions.toBundle());
    } else
        startActivity(intent);
}
//final detalle cupones


}

Solution

  • Add following code to your onCreateView method and remove code from onCreate method

    @Override
    public View onCreateView(
        LayoutInflater inflater, 
        ViewGroup container,
        Bundle savedInstanceState) {
    
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_ofertas,container,false);
    
        //inicio gridview
        gridView = (GridView) view.findViewById(R.id.grid);
        gridView.setAdapter(new AdaptadorDeCupones(this.getActivity()));
        gridView.setOnItemClickListener(this);
    
        return view;
    }