Question

I'm trying to create a ListView with files in a directory. I read this tutorial but my Application crashes..

So this is the LogCat:

03-16 15:46:03.781: D/AndroidRuntime(16689): Shutting down VM
03-16 15:46:03.781: W/dalvikvm(16689): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-16 15:46:03.800: E/AndroidRuntime(16689): FATAL EXCEPTION: main
03-16 15:46:03.800: E/AndroidRuntime(16689): java.lang.NullPointerException
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.AbsListView.obtainView(AbsListView.java:1430)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1216)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.ListView.onMeasure(ListView.java:1127)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:566)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.View.measure(View.java:8313)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.os.Looper.loop(Looper.java:123)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at android.app.ActivityThread.main(ActivityThread.java:3683)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at java.lang.reflect.Method.invokeNative(Native Method)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at java.lang.reflect.Method.invoke(Method.java:507)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-16 15:46:03.800: E/AndroidRuntime(16689):    at dalvik.system.NativeStart.main(Native Method)

And this is the code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.src.vicnote.MainActivity"
    tools:ignore="MergeRootFrame" >

    <Button
        android:id="@+id/buttonNew"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="New" />

    <ListView
        android:id="@+id/notesList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/buttonNew" >

    </ListView>

</RelativeLayout>

JAVA

public class MainActivity extends ActionBarActivity {

    Button newButton;

    String path = Environment.getExternalStorageDirectory().toString()+"/VICNote";
    File f = new File(path);
    File files[] = f.listFiles();
    String[] theNamesOfFiles = new String[files.length];


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.notesList);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, theNamesOfFiles);
        lv.setAdapter(adapter);


        newButton = (Button) findViewById(R.id.buttonNew);
        newButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Intent newNote = new Intent(MainActivity.this, NewNoteActivity.class);
                startActivity(newNote);
            }
        });

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }



}

I will be grateful if somebody help me :)

Was it helpful?

Solution

It's caused because you create an array of size files.length full of null referecens.


With

File files[] = f.listFiles();
String[] theNamesOfFiles = new String[files.length];

You just create a new Array of length files.length but don't add elements to it. So when the list try to create a view it just crash with NullPointerException.

You can just edit the ArrayAdapter from <String> to <File> to avoid the creation of a new array, since ArrayAdapter will use .toString() and File.toString() returns the file path.

Or use .list() to list every file and create an array of String[].

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