我一直试图修复这个空指针异常,但我不能。我知道它指向一个空对象,但我不知道如何解决它。我是Java编程的初学者,所以如果这是一个愚蠢的问题,请不要生气。
这是我的代码:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
public ArrayAdapter<String> itemsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//EditText
final EditText etTask = (EditText) findViewById(R.id.editText);
final String Task = etTask.getText().toString();
//Button
Button btn = (Button) findViewById(R.id.button);
//Null Fix
//OnClickListeners
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemsAdapter.add(Task);
etTask.setText("");
}
});
}
}
这是我的Logcat:
09-04 06:58:32.704 16735-16735/com.example.elias.doit E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.elias.doit, PID: 16735
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.add(java.lang.Object)' on a null object reference
at com.example.elias.doit.MainActivity$1.onClick(MainActivity.java:38)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-04 06:58:40.564 16735-16735/? I/Process﹕ Sending signal. PID: 16735 SIG: 9
答案 0 :(得分:2)
您的itemsAdapter
永远不会被初始化。它完全没有价值。这就是您拨打add()
时获得NullPointerException
的原因。
尝试这样做:
ArrayList<String> data = new ArrayList<>();
// add some data to your ArrayList.
itemsAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
您也可以使用String[]
数组代替ArrayList<String>
或任何其他List<String>
。
在您的代码上,它应该如下所示:
private ArrayAdapter<String> itemsAdapter;
private ArrayList<String> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//EditText
final EditText etTask = (EditText) findViewById(R.id.editText);
final String task = etTask.getText().toString();
data = new ArrayList<>();
itemsAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data);
//Button
Button btn = (Button) findViewById(R.id.button);
//OnClickListeners
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
data.add(task);
itemsAdapter.notifyDataSetChanged();
etTask.setText("");
}
});
修改:如果您正在创建ArrayAdapter
以便在ListView
之类的内容中使用。你的代码在哪里?我猜你也忘记了。
类似的东西:
ListView lv = (ListView) findViewById(R.id.yourListView);
// initialize the adapter and stuff.
lv.setAdapter(itemsAdapter);
要进一步阅读ListView
和适配器,请查看this link和this tutorial。另外,请检查the docs。
答案 1 :(得分:1)
初始化适配器itemsAdapter=new ArrayAdapter<>(...);
答案 2 :(得分:1)
在OnCreateView()中添加适配器并在添加任何值之前
itemsAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, taskNames);
这里的taskNames可以是任务名称的数组或数组列表,您可以将其定义为
ArrayList<String> taskNames; // or String[] taskNames;
让我知道它是否适合你...
并将其标记为答案,以便对其他人有用......
答案 3 :(得分:0)
当您尝试在其上调用ArrayAdapter
方法时,您尚未为itemsAdapter
变量创建add()
的实例。
尝试使用以下方法初始化它:
itemsAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, values);
注意:values
是String[]
或List<String>
,因此您需要正确传递
答案 4 :(得分:0)
我想你应该试试这个..!
ArrayList<MyClass> myList = new ArrayList<MyClass>();
ArrayAdapter<MyClass> adapter = new ArrayAdapter<MyClass>(this, R.layout.row,
to, myList.);
listView.setAdapter(adapter);