Question

I'm getting a force close issue after attempting to implement a splash screen into my app.

The issue occurs on line 76 lv.setAdapter(adapter); however I'm unsure as to why.

Any input is greatly appreciated.

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)

SOURCE:

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);
            }
        }
    }
Was it helpful?

Solution

Not to beat a dead horse but lv is null since you changed the layout with setContentView(). Maybe I can explain a little better why this is because I'm not sure you quite understand how Views work in the Activity.

When you call setContentView() it inflates the xml layout file that you set in this function. Initializing any View that is not in that layout file will return null which will give a NPE when you try to set a method on it such as setAdapter().

It appears that you are under the assumption that you can still initialize the ListView which is in another layout file...you cannot. You can only use Views inflated with setContentView() or by inflating the layout file which holds that View and adding it to the currently inflated `layout.

One way around this is to call setContentView() again in onPostExecute() then initialize your ListView and set the Adapter. I wouldn't normally recommend calling setContentView() more than once in a single Activity but in your case it may be the easiest for what you currently have.

So it might look like this

  @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);

OTHER TIPS

Is there a View named R.id.listView1 in splash.xml? It looks like you changed your setContentView() call to the splash screen, but your listview is on a more "main" page.

lv is likely null here. Have you verified in the debugger that it is getting set correctly when you set it to (ListView) findViewById(R.id.listView1);?

Null Pointer Exception suggest that there might be problem with lv. You have changed the name of xml.so verify whether R.id.listview1 is present in splash.xml

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top