ssj3goku878
ssj3goku878

Reputation: 755

Simple Adapter Null pointer

I am trying to store the data from an EditText into a ListView from another activity using a SimpleAdapter that is using pre defined rows from another XML file. All of this is defined in the button called Save Todo Everything works fine but when it comes to storing the data, I get a null pointer error. Image https://i.sstatic.net/DR5uA.png

import java.util.ArrayList;
import java.util.HashMap;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleAdapter;
import android.widget.Spinner;

public class Add_Item extends ActionBarActivity {
//variables
    EditText TaskNameET;
    Spinner SpinType;
    Button SaveTodo;
    String SpinnerOptions[] = {"OptionOne", "OptionTwo", "OptionThree"};
    SimpleAdapter ListAdapt;

//call mainactivity class
    MainActivity Main;

//declare arraylist and HashMap
    ArrayList<HashMap<String, String>> mylist;
    HashMap<String, String> map;

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

//define vars
        TaskNameET = (EditText) findViewById(R.id.TaskNameET);
        SpinType = (Spinner) findViewById(R.id.spinner1);
        SaveTodo = (Button) findViewById(R.id.button1);

//initialize mylist and map 
        mylist = new ArrayList<HashMap<String, String>>();
        map = new HashMap<String, String>();


//SimpleAdapter 
        ListAdapt = new SimpleAdapter(this, mylist, R.layout.row, new String[] {"columnone", "columntwo", "columnthree"}, new int[] {R.id.columnone, R.id.columntwo, R.id.columnthree});

//adapter for spinner
        ArrayAdapter<String> ard=new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, SpinnerOptions);
        SpinType.setAdapter(ard);

//onclick todobutton
        SaveTodo.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                map.put("columnone", Add_Item.this.TaskNameET.getText().toString());
                map.put("columntwo", Add_Item.this.TaskNameET.getText().toString());
                map.put("columnthree", Add_Item.this.TaskNameET.getText().toString());
                mylist.add(map);
               Main.MainList.setAdapter(ListAdapt);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.add__item, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

//R.layout Add_Item XML

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.moduleonesimpleapplication.Add_Item" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="30sp"
        android:text="@string/TitleText"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/TaskNameET"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="34dp"
        android:ems="10"
        android:inputType="text" >

        <requestFocus />

        <requestFocus />

    </EditText>

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_alignRight="@+id/TaskNameET"
        android:layout_below="@+id/TaskNameET"
        android:layout_marginTop="27dp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/TaskNameET"
        android:layout_alignParentLeft="true"
        android:text="@string/TaskNameTXT" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_below="@+id/textView3"
        android:layout_marginTop="48dp"
        android:text="@string/TaskDateTXT" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView4"
        android:layout_alignBottom="@+id/textView4"
        android:layout_alignLeft="@+id/spinner1"
        android:ems="10"
        android:inputType="date" >
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@+id/editText2"
        android:text="@string/SaveButton" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/spinner1"
        android:layout_alignLeft="@+id/textView2"
        android:layout_marginBottom="19dp"
        android:text="@string/TaskTypeTxT" />

</RelativeLayout>

//R.layout Row.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

        <TextView
            android:id="@+id/columnone"
            android:layout_width="100dip"
            android:layout_height="wrap_content"
            android:textColor="#C0C0C0"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/columntwo"
            android:layout_width="100dip"
            android:layout_height="wrap_content"
            android:textColor="#C0C0C0"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/columnthree"
            android:layout_width="120dip"
            android:layout_height="wrap_content"
            android:textColor="#C0C0C0"
            android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

Upvotes: 0

Views: 261

Answers (1)

Juan Aguilar Guisado
Juan Aguilar Guisado

Reputation: 1701

You have to initialize all variables (your map, your list etc.) in your onCreate method, not in the "declare" section.

I hope this helps ;)

EDIT:

According to your comment: setAdapter is being applied to a "null instance" of MainActivity. Why don't you create an static method in MainActivity which modifies your adapter? You will have to call it in the static way (nameClass.nameMethod(..)).

Be sure that this activity is always created after your MainActivity!

In your main activity:

  • Make your MainList static
  • Declare a static "mathod for having access to it:

    public static ListView getMainList(){return MainList;}

In your Add_activity:

  • Delete your declaration MainActivity main;
  • Change you line MainActivty.Main.setAdap... for

    MainActivity.getMainList().setAdapter(ListAdapt);

Eventhough... I think you are missing some points of Android basics because it's a really hard way of development for me.

Good luck!

Upvotes: 1

Related Questions