2

I'm trying to create a RelativeLayout using fragment class, but when I call the ListView setAdapter method in populateListView function I have a java.lang.NullPointerException, and I can't find what is wrong with my code. Thanks!!

My Fragment Class

public class ProductInFridge extends Fragment {

private View rootView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{


    rootView = inflater.inflate(R.layout.allproductinfridge,  container, false);

    populateListView();

    return rootView;

}

private void populateListView() {

    ArrayAdapter<Product> adapter = new MyListAdapter(getActivity(),R.layout.item_view, populateList());
    ListView list = (ListView) rootView.findViewById(R.id.AllProdlistView);
    list.setAdapter(adapter);

}

private List<Product> populateList(){

    List<Product> product = new ArrayList<Product>();


    product.add(new Product("Prod_1","01234242143",1,R.drawable.productt));
    product.add(new Product("Prod_2","012313123112",2,R.drawable.productt));
    product.add(new Product("Prod_3","24234234242",3,R.drawable.productt));

    return  product;
}


private class MyListAdapter extends ArrayAdapter<Product> {


    private List<Product> prod;


    public MyListAdapter(Context context, int view, List<Product> passedProd) {

        super(context, view , passedProd);

        prod = passedProd;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View itemView;




        itemView = getActivity().getLayoutInflater().inflate(R.layout.item_view,parent,false);



        //Find the product

        Product currentProd = prod.get(position);



        //Fill the view

        ImageView imageView = (ImageView)itemView.findViewById(R.id.imageView);
        imageView.setImageResource(currentProd.getPhotoID());

        //Name

        TextView nameTxt = (TextView)itemView.findViewById(R.id.item_txtName);
        nameTxt.setText(currentProd.getName());

        //BarCode

        TextView BarCodeTxt = (TextView)itemView.findViewById(R.id.item_txtBarCode);
        BarCodeTxt.setText(currentProd.getBarCode());

        return itemView;


    }
}
}

And here is my xml file with allproductinfridge layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFCC00"
android:id="@+id/AllProd_layout">


<RelativeLayout
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:background="#FFFFFFFF"
    android:id="@+id/Category_list">

    <android.support.design.widget.NavigationView
        android:id="@+id/main_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:itemIconTint="@color/colorAccent"
        app:itemTextColor="@color/colorTextSecondary"
        app:menu="@menu/allproductmenu" />

</RelativeLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/AllProductList"
    android:layout_toRightOf="@+id/Category_list"
    android:layout_toEndOf="@+id/Category_list">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/AllProdlistView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

And the item_view:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<ImageView
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:id="@+id/imageView"
    android:src="@drawable/productt" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Product Name"
    android:id="@+id/item_txtName"
    android:layout_marginLeft="45dp"
    android:layout_marginStart="45dp"
    android:layout_marginTop="30dp"
    android:textSize="30sp"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/imageView"
    android:layout_toEndOf="@+id/imageView" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:text="BarCode"
    android:id="@+id/item_txtBarCode"
    android:layout_below="@+id/item_txtName"
    android:layout_alignLeft="@+id/item_txtName"
    android:layout_alignStart="@+id/item_txtName"
    android:layout_marginLeft="53dp"
    android:layout_marginStart="53dp" />
</RelativeLayout>

Android logcat:

01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime: FATAL EXCEPTION: main
01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime: Process: slidenerd.vivz.navigationviewdemo, PID: 3355
01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime: java.lang.NullPointerException
01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime:     at slidenerd.vivz.navigationviewdemo.ProductInFridge.populateListView(ProductInFrid ge.java:44)
01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime:     at slidenerd.vivz.navigationviewdemo.ProductInFridge.onCreateView(ProductInFridge.java:34)
01-02 01:20:21.410 3355-3355/slidenerd.vivz.navigationviewdemo E/AndroidRuntime:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
Alex Timpau
  • 153
  • 1
  • 9

2 Answers2

0

You must inflate your view and then find your element:

View rootView = inflater.inflate(R.layout.allproductinfridge,  container, false);
ListView list = (ListView) rootView.findById(R.id.AllProdlistView);
//Now you can set your adapter
FloGz
  • 528
  • 1
  • 5
  • 12
  • Now the exception is thrown at this line: ListView list = (ListView) rootView.findViewById(R.id.AllProdlistView); – Alex Timpau Oct 22 '15 at 10:18
0

Verify your onCreateView() method. you are calling populateListView() and after than you are returning a totally new inflated layout by doing

return inflater.inflate(R.layout.allproductinfridge, container, false);

What you should do instead is in your onCreateView(). First inflate the view and hold it in a variable. Set necessary adapters / listeners and then return the view.

An example for setting button listeners - Button Listener for button in fragment in android

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.smart_tv_controller_fragment, container, false);
        upButton = (Button) view.findViewById(R.id.smart_tv_controller_framgment_up_button);
        upButton.setOnClickListener(this);
        return view;
     }

The view is to be inflated first. Then find the necessary component ( either a button or listview ) inside the inflated view and set listeners / adapter and then return the view.

Community
  • 1
  • 1
Parag Naik
  • 571
  • 6
  • 6