-2

I was working with an Activity with multiple Fragments. Whenever I update List from other Activity or Fragment I got NullPointerException here in line present in onStart method.

adapter = new MedicineAdapter(getActivity(), medicineList);

Here is my Fragment

public class frag_stock extends Fragment{

DatabaseReference databaseRoot;
DatabaseReference databaseMedicines;

EditText etSearch;

TextView tvAdd;

private ProgressBar spinner;

ListView listViewMedicine;

List<Medicine> medicineList;

MedicineAdapter adapter;

TextView emptyTextView;

int medicineCount =0;

private FirebaseAuth mAuth;

public HashMap<String , Integer> mapForDate = new HashMap<String , Integer>();

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_stock, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mAuth = FirebaseAuth.getInstance();

    spinner = (ProgressBar)view.findViewById(R.id.progressBar1);

    emptyTextView = (TextView)view.findViewById(R.id.empty_view);

    medicineList = new ArrayList<>();

    databaseRoot = FirebaseDatabase.getInstance().getReference();
    databaseMedicines = databaseRoot.child("Medicines");

    listViewMedicine = (ListView)view.findViewById(R.id.list);
    listViewMedicine.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            Medicine currentMedicine = adapter.getItem(position);

            assert currentMedicine != null;
            String name = currentMedicine.getMedicineName();
            int quantity = currentMedicine.getMedicineQuantity();
            String id = currentMedicine.getId();
            String type = currentMedicine.getType();

            Intent intent = new Intent(getActivity(),UpdateActivity.class);
            intent.putExtra("name",name);
            intent.putExtra("mapForDate",mapForDate);
            intent.putExtra("quantity",quantity);
            intent.putExtra("id",id);
            intent.putExtra("type",type);

            startActivity(intent);
        }
    });
    /*
    etSearch = (EditText)view.findViewById(R.id.etSearch);
    etSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

            List<Medicine> newList = new ArrayList<Medicine>();
            String filter = charSequence.toString();
            for (int i=0;i<medicineList.size();i++)
            {
                if (medicineList.get(i).getMedicineName().toLowerCase().contains(filter.toLowerCase()))
                {
                    newList.add(medicineList.get(i));
                }
            }

            if(newList.isEmpty()){
                emptyTextView.setText("No Medicines found!");
            }
            adapter = new MedicineAdapter(getActivity(),newList);

            listViewMedicine.setAdapter(adapter);

        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });
    */
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onStart() {
    super.onStart();

    if (getActivity() != null) {

        spinner.setVisibility(View.VISIBLE);
        databaseMedicines.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (!medicineList.isEmpty()) {
                    adapter = new MedicineAdapter(getActivity(), medicineList);
                    listViewMedicine.setAdapter(adapter);
                }
                medicineList.clear();


                for (DataSnapshot medicineSnapshot : dataSnapshot.getChildren()) {
                    Medicine medicine = medicineSnapshot.getValue(Medicine.class);
                    medicineList.add(medicine);
                }
                //Toast.makeText(MainActivity.this, medicineList.size() + "", Toast.LENGTH_SHORT).show();

                adapter = new MedicineAdapter(getActivity(), medicineList);

                listViewMedicine.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        spinner.setVisibility(View.GONE);
    }
}

Logcat

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
                                                                                              at android.view.LayoutInflater.from(LayoutInflater.java:234)
                                                                                              at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:178)
                                                                                              at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:163)
                                                                                              at com.example.android.hospitalmanagementsystem.MedicineAdapter.<init>(MedicineAdapter.java:0)
                                                                                              at com.example.android.hospitalmanagementsystem.frag_stock$2.onDataChange(frag_stock.java:166)
                                                                                              at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                                              at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                                              at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                                              at android.app.ActivityThread.main(ActivityThread.java:7331)
                                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Adapter class

public class MedicineAdapter extends ArrayAdapter<Medicine> {

private Activity context;
private Filter medicineFilter;
private List<Medicine> medicineList;

public MedicineAdapter(Activity context, List<Medicine> medicines) {
    super(context,0,medicines);
    this.context = context;
    this.medicineList = medicines;
}

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

    LayoutInflater inflater = context.getLayoutInflater();

    View listItemView = convertView;

    if (listItemView == null) {
        listItemView = inflater.inflate(R.layout.list_item,null,true);
    }

    TextView medicineNameTV = (TextView)listItemView.findViewById(R.id.medicineName);
    TextView medicineQuantityTV = (TextView)listItemView.findViewById(R.id.medicineQuantity);
    TextView medicineType = (TextView)listItemView.findViewById(R.id.medicineType);

    Medicine currentMedicine = getItem(position);

    GradientDrawable quantityCircle = (GradientDrawable) medicineQuantityTV.getBackground();


    assert currentMedicine != null;
    int quantityColor = getQuantityColor(currentMedicine.getMedicineQuantity());

    quantityCircle.setColor(quantityColor);

    assert currentMedicine != null;
    medicineNameTV.setText(currentMedicine.getMedicineName());
    medicineQuantityTV.setText(String.valueOf(currentMedicine.getMedicineQuantity()));
    medicineType.setText(currentMedicine.getType());

    return listItemView;
}

public int getQuantityColor(int quantity){
    int quanColor = 0;
    if(quantity <= 30){
        quanColor = ContextCompat.getColor(getContext(), R.color.quantity1);
    }
    else if(quantity > 30 && quantity < 100){
        quanColor = ContextCompat.getColor(getContext(), R.color.quantity2);
    }
    else if(quantity >= 100){
        quanColor = ContextCompat.getColor(getContext(), R.color.quantity3);
    }
    else{
        quanColor = ContextCompat.getColor(getContext(), R.color.quantity4);
    }

    return quanColor;
}

}

crank_95
  • 11
  • 7

3 Answers3

3

Create a variable in frag_stock class and get the context from onAttach() method and pass that context.

 Context c =null;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
   c= context;
}

pass this c varaible to adapter.

and Make changes in Adapter like this.

public MedicineAdapter(Context context, List<Medicine> medicines) {
super(context,0,medicines);
this.context = context;
this.medicineList = medicines;

}

Donot use getActivity() use context from onAttach().

Hope this will help.

Gowthaman M
  • 8,057
  • 8
  • 35
  • 54
Sardar Khan
  • 845
  • 6
  • 16
-1

It is probably because of getActivity() (first param of MedicineAdapter constructor) . Try to get the activity from the fragment's context or from the parent fragment / activity.

Ionut J. Bejan
  • 734
  • 11
  • 28
-1

I think that you can resolve that problem by overriding the onAttach method of Fragment:

public static class YourClass extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
       adapter = new MedicineAdapter(getActivity(), medicineList);
                    listViewMedicine.setAdapter(adapter);
    }
}

When you changed list use adapter.notifyDataSetChanged.

Jean-François Corbett
  • 37,420
  • 30
  • 139
  • 188