Francesco Ambrosini
Francesco Ambrosini

Reputation: 501

ArrayAdapter and ListView

I have this code which has to get a listview and populate it with an array adapter:

public class news extends ListActivity {
public String[] titoli = new String[99];
public String[] descrizioni = new String[99];

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new connection().execute();
    System.out.println("prova1");
}

public class connection extends AsyncTask<Void, Void, Void> {
    public Void doInBackground(Void... params) {
        System.out.println("prova2");
        // All static variables
        final String URL = "http://www.messedaglia.it/index.php/archivio-news?format=feed&type=rss";
        // XML node keys
        final String ITEM = "item"; // parent node
        final String TITLE = "title";
        final String DESC = "description";
        Element e = null;
        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); // getting XML
        Document doc = parser.getDomElement(xml); // getting DOM element
        NodeList nl = doc.getElementsByTagName(ITEM);

        // looping through all item nodes <item>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map.put(TITLE, parser.getValue(e, TITLE));
            map.put(DESC, parser.getValue(e, DESC));

            // adding HashList to ArrayList
            menuItems.add(map);
        }
        System.out.println("prova3");
        for (int c = 0; c < nl.getLength(); c++) {
            e = (Element) nl.item(c);
            titoli[c] = parser.getValue(e, TITLE); // name child value
            descrizioni[c] = parser.getValue(e, DESC);
        }
        return null;
    }

    public void onPostExecute() {
        System.out.println("prova4");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(news.this,
                android.R.layout.simple_list_item_1, titoli);
        System.out.println("prova5");
        ListView listView = (ListView) news.this
                .findViewById(android.R.id.list);
        listView.setAdapter(adapter);
    }
     }
 }

the log show a Null Pointer Exception here(line 33 of my code):

listView.setAdapter(adapter);

LOG:

02-07 13:38:36.020: E/AndroidRuntime(13803): FATAL EXCEPTION: main
02-07 13:38:36.020: E/AndroidRuntime(13803): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.messedagliavr.messeapp/com.messedagliavr.messeapp.news}: java.lang.NullPointerException
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.os.Looper.loop(Looper.java:137)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.main(ActivityThread.java:4898)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at java.lang.reflect.Method.invokeNative(Native Method)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at java.lang.reflect.Method.invoke(Method.java:511)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at dalvik.system.NativeStart.main(Native Method)
02-07 13:38:36.020: E/AndroidRuntime(13803): Caused by: java.lang.NullPointerException
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.messedagliavr.messeapp.news.onCreate(news.java:33)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.Activity.performCreate(Activity.java:5206)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
02-07 13:38:36.020: E/AndroidRuntime(13803):    ... 11 more
    

Most of you say to add setContentView(). I removed it because adding it I get this error:

error: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

Upvotes: 0

Views: 1358

Answers (3)

Audrius Meškauskas
Audrius Meškauskas

Reputation: 21778

This is because the layout is not set on your component. First you need to call setContentView(R.layout.my_great_layout), only then it makes sense to call findViewById.

Be sure you have a ListView with android.R.id.list id in your layout:

  <ListView
      android:id="@android:id/list"
  .....

Upvotes: 1

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132992

as in log :

NullPointerException 02-07 13:38:36.020: E/AndroidRuntime(13803):
at com.messedagliavr.messeapp.news.onCreate(news.java:33)

because titoli array is empty. you are using AsyncTask for getting elements in titoli array then just move your adapter code onPostExecute method

and use

ListView listView = (ListView) findViewById(android.R.id.list);

instead of

ListView listView = (ListView) findViewById(R.id.list);

to get ListView reference and must declare ListView id as android:id="@android:id/list" in xml layout if you are using

Upvotes: 2

Shiv
Shiv

Reputation: 4567

You are missing to set main layout

     public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
     setContentView(R.layout.main);    <----------------here
     new connection().execute();
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, titoli);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}

Upvotes: 2

Related Questions