0

I created this Adapter for my App:

public class DeadlineAdapter extends ArrayAdapter<Deadline> {
    private Activity context;
    public List<Deadline> deadlineList;

    public DeadlineAdapter(Activity context, List<Deadline> deadlineList){
        super(context, R.layout.item_deadline, deadlineList);
        this.context = context;
        this.deadlineList = deadlineList;
    }

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

        LayoutInflater inflater = context.getLayoutInflater();
        View listView = inflater.inflate(R.layout.item_deadline, parent, false);

        TextView displayDate = listView.findViewById(R.id.display_deadline_date_tv);
        TextView displayName = listView.findViewById(R.id.display_deadline_name_tv);
        Deadline deadline = deadlineList.get(position);
        displayDate.setText(deadline.getDate());
        displayName.setText(deadline.getDeadlineName());

        return listView;
    }
}

But every time I try to run the app, my App crashes. The log says the following:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

How do I solve this problem?

ColdFire
  • 6,764
  • 6
  • 35
  • 51
Moritz L.
  • 177
  • 1
  • 2
  • 10
  • Please note it does not tell you the adapter is null but the ListView seems to be null – Bö macht Blau Mar 08 '19 at 15:14
  • 3
    As you can see in your log, whatever object you're calling `setAdapter` on is null. You're not calling that method in this class, so the error originates elsewhere. – kjerins Mar 08 '19 at 15:15

1 Answers1

1

Check my example. I am using just String as elements in list.

And remember that you should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling and saving memory.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

ActivityMain.java

public class ActivityMain extends AppCompatActivity {

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

        setupUi();
    }

    private void setupUi() {
        List<String> elements = new ArrayList<>(Arrays.asList(
                "Red",
                "Blue",
                "Green",
                "Black"
        ));

        DeadlineAdapter adapter = new DeadlineAdapter(this, elements);

        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}

And adapter - DeadlineAdapter.java:

public class DeadlineAdapter extends ArrayAdapter<String> {

    private Activity context;
    private List<String> deadlineList;

    public DeadlineAdapter(Activity context, List<String> deadlineList) {
        super(context, R.layout.item_deadline, deadlineList);
        this.context = context;
        this.deadlineList = deadlineList;
    }

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

        LayoutInflater inflater = context.getLayoutInflater();
        View listView = inflater.inflate(R.layout.item_deadline, parent, false);

        TextView positionTv = listView.findViewById(R.id.row_id);
        TextView textTv = listView.findViewById(R.id.row_text);

        positionTv.setText(String.format("%s.", position + 1));
        textTv.setText(deadlineList.get(position));

        return listView;
    }
}

And item for list - item_deadline:

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

    <TextView
        android:id="@+id/row_id"
        android:layout_width="100dp"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/row_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Expected output: expected output

Boken
  • 4,825
  • 10
  • 32
  • 42