2015-04-24 2 views
-4

У меня есть ListView для отображения содержимого от ArrayList. Я звоню listView.setAdapter из моего метода.ListView Crash FATAL EXCEPTION


В моем приложении я могу accses на topten_activity из й main_actiivty или если я закончить игру я получил и цель, которая ссылается меня добавить данные (лицо); мой Topten_activity:

<?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:background="@drawable/bg_1" 
android:orientation="vertical" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 
</ListView> 

</LinearLayout> 

Всякий раз, когда запуск деятельности/намерения. приложение врезаться

FATAL EXCEPRION:main. 

я использовал Log.d в моем методе, который установлен адаптер. Журнал печатается, так что вызов достигает там

Пожалуйста, посмотрите на мой код ниже

Код:

public class TopTen extends ListActivity{ 

Person p; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_topten); 
    Log.d("inside", "TopTen OnCreat"); 
    populateListView(); 
} 

private void populateListView(){ 
    Log.d("inside", "populateListView"); 
    ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, R.layout.activity_topten,p.TopTen); 
    ListView list =(ListView) findViewById(android.R.id.list); 
    list.setAdapter(adapter); 
} 
} 

StackTrace:

FATAL EXCEPTION: main 
Process: com.example.flagsgame, PID: 29436 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.flagsgame/com.example.flagsgame.TopTen}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 
    at android.app.ActivityThread.access$800(ActivityThread.java:144) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5146) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at com.example.flagsgame.TopTen.populateListView(TopTen.java:26) 
    at com.example.flagsgame.TopTen.onCreate(TopTen.java:21) 
    at android.app.Activity.performCreate(Activity.java:5231) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 

Person. класс:

public class Person extends Activity{ 

EditText name; 
Button ok; 
TextView enter; 
Integer Score; 
String Name; 
Person person; 
Person a; 
Person b; 
Person c; 

//Map<String,Integer>Names=new HashMap<String,Integer>(10); 
ArrayList<Person>TopTen = new ArrayList<Person>(10); 
//Map sortedMap; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_person); 

    Intent intent = getIntent(); 
    Score = intent.getIntExtra("Score", 0); 
    name =(EditText)findViewById(R.id.namep); 
    ok =(Button)findViewById(R.id.send); 
    enter =(TextView)findViewById(R.id.entername); 
    Toast toast = Toast.makeText(getApplicationContext(), "Lets see if you are can be on TopTen", Toast.LENGTH_SHORT); 

    a.Name="Daniel"; 
    a.Score=20; 
    b.Name="Zohar"; 
    b.Score=15; 
    c.Name="Yakir"; 
    c.Score=10; 

    TopTen.add(a); 
    TopTen.add(b); 
    TopTen.add(c); 

    ok.setOnClickListener(SendActionListener); 
} 

private OnClickListener SendActionListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Person lastEntry = TopTen.get(TopTen.size()-1);//Last element of the arraylist 
     if(lastEntry.Score < Score){//checking score 
      lastEntry.Score = Score;//put score aka Value 
      lastEntry.Name=name.getText().toString();//put name aka Key 
      Toast toast = Toast.makeText(getApplicationContext(), "You are now on the TopTen List", Toast.LENGTH_SHORT); 
     } 
    }; 

}; 

}//end of Person 
+0

Кто из первых людей деятельности или TopTen? – Amsheer

+0

Если ям в главном, поэтому я могу пойти сначала в TopTen, но если ям в игре так, что Person будет первым – Adi

+0

Хорошо В этом есть проблема.Я объясню в ответ. – Amsheer

ответ

0

Вы не инициализирован свой Person класс по onCreate() методу, поэтому p.TopTen равна нулю. Таким образом, вам необходимо сделать это

p = new Person(); 
+0

У меня есть одно сомнение. Если инициализировать это, то нужно создать конструктор в классе Person правильно? А Person - это активность. Это работает? Я хочу знать. Я думаю, что ваш ответ будет работать. – Amsheer

+0

Если класс 'Person' - это активность, вы не можете инициировать активность. Вместо того, чтобы вы можете сделать публичную статическую переменную в этом действии и получить доступ к 'Person.yourVarName' – Piyush

+0

Спасибо, что ваша работа – Adi

0

Person p; не был инициализирован

+0

, но вот как мне его определить? – Adi

+3

Не знаю. Я знаю только, что ваша ошибка - это NPE, вызванная строкой 26 в методе TopTen # populateListView, и я вижу, что p не был инициализирован. – inmyth

+0

@Adi ... inmyth - это правильная инициализация переменной 'p'. затем вызовите адаптер списка. см. вызов «ArrayAdapter adapter = new ArrayAdapter (это, R.layout.activity_topten, p.TopTen);' переменной необходимо инициализировать палин и просто. В вашем случае 'p.TopTen' is =>' null.TopTen' –

0

Существует одна проблема в вашем коде. То есть вы получаете значение ArrayList от одного действия к другому. И есть еще один момент, который вы упоминаете в комментарии, а не два действия вызываются только одним вызываемым. В этом случае вы инициализируете или нет, что не имеет значения, вы можете получить нулевой указатель.

Таким образом, мирное решение просто инициализирует ArrayList в своей собственной деятельности.

Например:

В вашей TopTen деятельности инициализируются ArrayList

ArrayList<Person>TopTen_array = new ArrayList<Person>(10); 

Добавить значения ArrayList в OnCreate

a.Name="Daniel"; 
     a.Score=20; 
     b.Name="Zohar"; 
     b.Score=15; 
     c.Name="Yakir"; 
     c.Score=10; 

     TopTen_array.add(a); 
     TopTen_array.add(b); 
     TopTen_array.add(c); 

и заменить следующие строки

ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, R.layout.activity_topten,p.TopTen); 

с этим

ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, R.layout.activity_topten,TopTen_array); 
+0

TopTen не может быть разрешен переменной – Adi

+0

В какой строке вы получаете эту ошибку? – Amsheer

+0

См. Мой отредактированный ответ – Amsheer