0

尝试在我的应用程序中实现启动画面后,我遇到了强制关闭问题。

问题发生在第 76 行, lv.setAdapter(adapter);但我不确定为什么。

非常感谢任何输入。

09-19 15:20:53.687: E/AndroidRuntime(25177): FATAL EXCEPTION: main
09-19 15:20:53.687: E/AndroidRuntime(25177): java.lang.NullPointerException
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:76)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:1)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Looper.loop(Looper.java:137)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.app.ActivityThread.main(ActivityThread.java:4931)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invokeNative(Native Method)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at dalvik.system.NativeStart.main(Native Method)

来源:

public class MainActivity extends Activity {
    Context context;
    ArrayList<String> aa = new ArrayList<String>();
        ListView lv;
        final String URL = "http://news.google.com";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
            setContentView(R.layout.splash);
            lv= (ListView) findViewById(R.id.listView1);
            new MyTask().execute(URL);

        }

        private class MyTask extends AsyncTask<String, Void, String> {
            ProgressDialog prog;
            String title = "";

            @Override
            protected void onPreExecute() {
                prog = new ProgressDialog(MainActivity.this);
                prog.setMessage("Loading....");
                prog.show();
            }

            @Override
            protected String doInBackground(String... params) {
                try {
                    Document doc = Jsoup.connect(params[0]).get();
                    Element tableHeader = doc.select("tr").first();

                    for (Element element : tableHeader.children()) {
                        aa.add(element.text().toString());
                    }

                    title = doc.title();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return title;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                prog.dismiss();
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
                lv.setAdapter(adapter);
            }
        }
    }
4

4 回答 4

1

是否有一个名为R.id.listView1in的视图splash.xml?看起来您将setContentView()呼叫更改为启动屏幕,但您的列表视图位于更“主”页面上。

于 2013-09-19T19:32:01.530 回答
1

不是打死马,而是lv因为null你改变了layoutwith setContentView()。也许我可以更好地解释一下为什么会这样,因为我不确定您是否完全理解Views.Activity

当您调用setContentView()它时,会膨胀xml layout您在此函数中设置的文件。初始化不在该文件中的任何View内容都将返回,当您尝试在其上设置方法时会返回.layoutnullNPEsetAdapter()

看来您假设您仍然可以初始化ListView另一个文件中的layout文件……您不能。您只能使用Viewsinflated withsetContentView()或通过对layout包含该文件的文件进行充气并将其View添加到当前充气的 `layout.

解决此问题的一种方法是再次调用setContentView()onPostExecute() 然后初始化ListView并设置Adapter. 我通常不建议setContentView()一次多次调用,Activity但在你的情况下,这可能是你目前拥有的最简单的方法。

所以它可能看起来像这样

  @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            prog.dismiss();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.listView1);
            lv.setAdapter(adapter);
于 2013-09-19T19:47:09.557 回答
0

lv在这里很可能是空的。您是否在调试器中验证了当您将其设置为时设置正确(ListView) findViewById(R.id.listView1);

于 2013-09-19T19:30:15.723 回答
0

Null Pointer Exception 提示 lv 可能有问题。您已更改 xml.so 的名称,因此请验证splash.xml 中是否存在 R.id.listview1

于 2013-09-19T19:37:45.537 回答