0

Я пытаюсь сохранить данные из EditText в ListView из другого действия, используя SimpleAdapter, который использует предварительно определенные строки из другого XML-файла. Все это определено в кнопке Save Todo Все работает нормально, но когда дело доходит до хранения данных, я получаю ошибку с нулевым указателем. Изображение http://i.imgur.com/k95cilO.pngПростой адаптер Null pointer

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> 
+0

не уверен, что вы ожидаете от «Main.MainList.setAdapter», но я сомневаюсь, что это работает. – njzk2

+0

предполагается добавить сохраненные данные из адаптера в список в файле MainActivity.java – ssj3goku878

+0

, который не будет работать. взаимодействие между ними несколько сложнее. – njzk2

ответ

1

Вы должны инициализировать все переменные (карту, список и т. д.) в вашем методе onCreate, а не в разделе «объявление».

Я надеюсь, что это помогает;)

EDIT:

Согласно Ваш комментарий: setAdapter прикладывается к "нулевой", например из MainActivity. Почему бы вам не создать статический метод в MainActivity, который изменяет ваш адаптер? Вам придется называть это статическим способом (nameClass.nameMethod(..)).

Убедитесь, что эта активность всегда создана после вашего MainActivity!

В вашей основной деятельности:

  • Сделать свой MainList статический
  • Объявите статический «Mathod для получения доступа к нему:

    общественности статической ListView getMainList() {вернуться MainList;}

В вашем Add_activity:

  • Удалить ваше объявление MainActivity main;
  • Изменение вы выравнивают MainActivty.Main.setAdap... для

    MainActivity.getMainList() setAdapter (ListAdapt).

Eventough ... Я думаю, что вам не хватает некоторых оснований Android, потому что для меня это очень трудный способ развития.

Удачи вам!

+0

благодарю yuo за вашу помощь, я объявил переменные mylist и map в раздел declare и перенес инициализацию в метод oncreate, но я все еще получаю нулевой указатель, можете ли вы перепроверить мой код? Я изменил это. – ssj3goku878

+0

Я попробую. Всего минуту;) –

+0

Можете ли вы разместить свой макет R.layout.activity_add__item? –