Android ListView:尝试使用文件名数组setAdapter时出错

时间:2014-03-16 14:06:12

标签: java android eclipse listview listadapter

我正在尝试使用目录中的文件创建ListView。我阅读了this教程,但我的应用程序崩溃了..

所以这是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)

这是代码:

<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();
        }
    }



}

如果有人帮助我,我将不胜感激:)

1 个答案:

答案 0 :(得分:0)

它的原因是您创建了一个大小为files.length的数组,其中包含null个引用。


使用

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

您只需创建一个长度为files.length的新数组,但不要向其中添加元素。因此,当列表尝试创建视图时,它会与NullPointerException崩溃。

您只需从&lt; String&gt;编辑ArrayAdapter即可到&lt;文件&gt;避免创建新数组,因为ArrayAdapter将使用.toString()File.toString()返回文件路径。

或使用.list()列出每个文件并创建一个String[]数组。