Search code examples
androidlistadapter

Why do I get null value on listAdapter?


I got an error on my list adapter listAdapter = new ListAdapter(models, this);, I'm making myself a custom adapter name ListAdapter.

I thought because there is no data so I put in the data using model.add and after I tried to put in the data programmatically, I still got an error says the same thing.

How can I solve this? Below I give you some code examples.

MainActivity:

private ListAdapter listAdapter;
private ArrayList<Model> models;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_income);
    models = new ArrayList<>();
    listAdapter = new ListAdapter(models, this);
    listAdapter.notifyDataSetChanged();
    listView.setAdapter(listAdapter);
    findView();
    initView();
    initListener();
}

@Override
public void findView() {
    listView = findViewById(R.id.list_pemasukan);
    dateSet = findViewById(R.id.date_set);
    bAddIncome = findViewById(R.id.add_income);
    frameLayout = findViewById(R.id.frame_layout_income);
    bPickDate = findViewById(R.id.pick_date);
}

It said my adapter is null and I don't understand where it sets this value. I try to put some data on model using model.add but it still didn't change.

ListAdapter:

public class ListAdapter extends ArrayAdapter<Model> {

    private ArrayList<Model> dataTable;
    Context context;

    private static class ViewHolder {
        TextView txInOut;
        TextView txDay;
        TextView txMonth;
        TextView txYear;
        TextView Descriptions;
    }

    public ListAdapter(ArrayList<Model> data, Context context) {
        super(context, R.layout.list_row, data);
        this.context = context;
        this.dataTable = data;
    }

    private int lastPosition = -1;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Model dataModel = getItem(position);
        ViewHolder viewHolder;
        final View result;

        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.list_row, parent, false);
            viewHolder.txInOut = convertView.findViewById(R.id.pemasukan);
            viewHolder.txDay = convertView.findViewById(R.id.tanggal);
            viewHolder.txMonth = convertView.findViewById(R.id.bulan);
            viewHolder.txYear = convertView.findViewById(R.id.year);
            viewHolder.Descriptions = convertView.findViewById(R.id.keterangan);

            result = convertView;

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result = convertView;
        }

        Animation animation = AnimationUtils.loadAnimation(context, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
        result.startAnimation(animation);
        lastPosition = position;

        viewHolder.txInOut.setText(dataModel.getPemasukan());
        viewHolder.txDay.setText(dataModel.getDay());
        viewHolder.txMonth.setText(dataModel.getMonth());
        viewHolder.txYear.setText(dataModel.getYear());
        viewHolder.Descriptions.setText(dataModel.getKeterangan());

        return convertView;
    }
}

This is my error, I don't understand where my error comes from.

Error message:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
    at com.educastudio.marbelmoneymanager.IncomeActivity.onCreate(IncomeActivity.java:53)
    at android.app.Activity.performCreate(Activity.java:6267)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2372)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5420) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-19 19:42:11.854 6740-6740/com.educastudio.marbelmoneymanager I/Process: Sending signal. PID: 6740 SIG: 9

Solution

  • @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_income);
         findView();
        initView();
        initListener();
        models = new ArrayList<>();
        listAdapter = new ListAdapter(models, this);
        listAdapter.notifyDataSetChanged();
        listView.setAdapter(listAdapter);
    
    }