1

I have a spinner, which already contains some items. I'm trying to add a new item to it after getting it from another activity by setResult and onActivityResult:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null 
    {...}
    else if(requestCode == GET_NEW_STUDENT_NAME)
    {
        String name = data.getStringExtra("name");
        ArrayAdapter<String> adapter = (ArrayAdapter<String>)studentsSpinner.getAdapter();
        adapter.add(name);
        studentsSpinner.setAdapter(adapter);
    }
}

However, every time the code runs, the activity closes. This exception is being shown:

03-29 19:20:30.925 26953-26953/com.example.user.privatelessons E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.user.privatelessons, PID: 26953 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { (has extras) }} to activity {com.example.user.privatelessons/com.example.user.privatelessons.AddLessonActivity}: java.lang.NullPointerException: println needs a message at android.app.ActivityThread.deliverResults(ActivityThread.java:4179) at android.app.ActivityThread.handleSendResult(ActivityThread.java:4222) at android.app.ActivityThread.-wrap20(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6238) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) Caused by: java.lang.NullPointerException: println needs a message at android.util.Log.println_native(Native Method) at android.util.Log.e(Log.java:236) at com.example.user.privatelessons.AddLessonActivity.onActivityResult(AddLessonActivity.java:123) at android.app.Activity.dispatchActivityResult(Activity.java:7121) at android.app.ActivityThread.deliverResults(ActivityThread.java:4175) at android.app.ActivityThread.handleSendResult(ActivityThread.java:4222)  at android.app.ActivityThread.-wrap20(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:163)  at android.app.ActivityThread.main(ActivityThread.java:6238)

[EDIT]: At start, I initialize the spinner with following code:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_item, db.GetStudentslist());;
spinner.setAdapter(adapter);

GetStudentslist() returns String[].

The following code, which just shows the name in the logcat (without adding it to spinner), works fine:

 if(requestCode == GET_NEW_STUDENT_NAME && data != null)
            {
                String name = data.getStringExtra("name");
/*                List<String> names = Arrays.asList(db.GetStudentslist());
                names.add(name);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_spinner_item, names);;
                studentsSpinner.setAdapter(adapter);*/
                Log.e("Name", name);
            }
gogolon
  • 89
  • 4
  • 10

3 Answers3

2

You have to store output from the method db.GetStudentslist() to some field (list) in your class (Activity). And when you would like to add/remove/change elements just modify list, and update it in adapter.

I created simple example:

Activity

package training.com.myapplication;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    // List with three predefined elements
    private List<String> listOfElements = new ArrayList<>(Arrays.asList(
            "Hello world", "Hello world", "Hello world"
    ));

    // Adapter for the Spinner
    private ArrayAdapter<String> adapter;

    private Spinner spinner;

    private Button addButton;
    private Button removeButton;

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

        // Initialize adapter
        adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_spinner_item, listOfElements);

        spinner = findViewById(R.id.action_bar_spinner);

        addButton = findViewById(R.id.add_button);
        removeButton = findViewById(R.id.remove_button);

        // Set adapter
        spinner.setAdapter(adapter);

        addButton.setOnClickListener(view -> {
            // Add new element to the list
            listOfElements.add("Hello world");
        });

        removeButton.setOnClickListener(view -> {
            // Remove last item from the list
            int lastIndex = listOfElements.size() - 1;
            listOfElements.remove(lastIndex);
        });
    }
}

With simple layout:

<?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:layout_margin="40dp"
    android:orientation="vertical">

    <Spinner
        android:id="@+id/action_bar_spinner"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <Button
        android:id="@+id/add_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="+"
        android:textSize="30sp" />

    <Button
        android:id="@+id/remove_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="-"
        android:textSize="30sp" />

</LinearLayout>

Expected output

Layout


If you receiving data in onActivityResult() you can do it in the same way:

// Read data
String name = data.getStringExtra("name");

// Add to list
listOfElements.add(name);

Remember to start activity properly:

startActivityForResult(intent, GET_NEW_STUDENT_NAME);

and if you want to send data back:

Intent returnIntent = new Intent();
returnIntent.putExtra("name",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

and in your onActivityResult() method you have to check two conditions:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    // Check result
    if (resultCode == Activity.RESULT_OK) {
        // And check what was requested
        if (requestCode == GET_NEW_STUDENT_NAME) {
            String name = data.getStringExtra("name");
            listOfElements.add(name);
        }
    }
}
Boken
  • 4,825
  • 10
  • 32
  • 42
  • 1
    Storing the list is a good idea, but it didn't help. It looks like it has something to do with onActivityResult method, which the code is put inside of. I finally got an excepton (it's not thrown every time for some reason). I edited my question to make it clear. Sorry for not doing it before. – gogolon Mar 29 '19 at 18:17
  • That's what I checked last time, but the exception keeps appearing. – gogolon Mar 29 '19 at 18:27
  • @gogolon you are NOT checking `resultCode` for this Activity. Check my example. – Boken Mar 29 '19 at 18:38
0

I finally got it working. It turned out that this question is a duplicate of Unable to modify ArrayAdapter in ListView: UnsupportedOperationException

gogolon
  • 89
  • 4
  • 10
0

For that Make List<> Variable,ArrayAdapter Globally above onCreate Method.
add defaults items in oncreate Method and configure Arrayadapter for that spinner.


Then in onActivityResult add that new value in List.add("String").

After that add this line.
adapter.notifydatasetchanges(); it will update your data into spinner control.



If need more help i will give attach example here.

Jigar
  • 104
  • 7