【问题标题】:Android App Crashing - List View - CSV fileAndroid 应用程序崩溃 - 列表视图 - CSV 文件
【发布时间】:2014-12-01 15:22:43
【问题描述】:

好的,我正在尝试填充列表视图,但加载时它崩溃了。

将产品从 CSV 导入 Android Studio 中的列表视图。

这是我的 CSV https://drive.google.com/file/d/0BycsF7WMf1cYMzBOMk1mZmliWW8/view?usp=sharing

主活动:

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {

    ListViewAdapter itemAdapter;

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

        ListView itemList = (ListView)findViewById(R.id.itemListView);

        itemAdapter = new ListViewAdapter(this, -1);

        itemList.setAdapter(itemAdapter);

    }
}

列表视图适配器

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ListViewAdapter extends ArrayAdapter<DataStates> {
    Context contxt;

    public ListViewAdapter(Context context, int testViewResourceID) {
        super(context, testViewResourceID);
        contxt = context;
        loadArrayData();
    }

    @Override
    public View getView (final int pos, View convertView, final ViewGroup parent) {
        TextView mView = (TextView) convertView;

        if(mView == null) {
            mView = new TextView(parent.getContext());
            mView.setTextSize(28);
        }

        return mView;
    }

private void loadArrayData() {
    try {
        InputStream is = contxt.getAssets().open("data.csv");
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;

        while ((line = reader.readLine()) != null) {

            String[] RowData = line.split(",");

            DataStates cur = new DataStates();
            cur.setTitle(RowData[2]);
            cur.setPrice(RowData[3]);
            cur.setDescription(RowData[4]);

            this.add(cur);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

数据状态

import android.net.Uri;

public class DataStates {

    private String title;
    private String price;
    private String description;



    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }






}

activity_main

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/itemListView"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentStart="true" />
</LinearLayout>

LogCat 信息

10-07 21:43:31.241  25819-25819/tk.delacour.projectalpha D/dalvikvm﹕ Late-enabling CheckJNI
10-07 21:43:31.241  25819-25819/tk.delacour.projectalpha D/dalvikvm﹕ Try to disable coredump for pid 25819
10-07 21:43:31.241  25819-25819/tk.delacour.projectalpha D/dalvikvm﹕ Process 25819 nice name: tk.delacour.projectalpha
10-07 21:43:31.241  25819-25819/tk.delacour.projectalpha D/dalvikvm﹕ Extra Options: not specified
10-07 21:43:31.401  25819-25819/tk.delacour.projectalpha D/AndroidRuntime﹕ Shutting down VM
10-07 21:43:31.401  25819-25819/tk.delacour.projectalpha W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x42f05500)
10-07 21:43:31.411  25819-25819/tk.delacour.projectalpha E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{tk.delacour.projectalpha/tk.delacour.projectalpha.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
            at android.app.ActivityThread.access$600(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:150)
            at android.app.ActivityThread.main(ActivityThread.java:5390)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
            at tk.delacour.projectalpha.ListViewAdapter.loadArrayData(ListViewAdapter.java:63)
            at tk.delacour.projectalpha.ListViewAdapter.<init>(ListViewAdapter.java:28)
            at tk.delacour.projectalpha.MainActivity.onCreate(MainActivity.java:19)
            at android.app.Activity.performCreate(Activity.java:5303)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2296)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
            at android.app.ActivityThread.access$600(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:150)
            at android.app.ActivityThread.main(ActivityThread.java:5390)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 分享你的 logcat 输出
  • 好的,刚刚编辑了,日志猫贴出来了

标签: java android listview csv android-listview


【解决方案1】:

好的,此时您的程序失败了:

while ((line = reader.readLine()) != null) {

        String[] RowData = line.split(",");
        DataStates cur = new DataStates();
        cur.setTitle(RowData[2]);
        cur.setPrice(RowData[3]);
        // now there is a ArrayIndexOutOfBoundsException
        cur.setDescription(RowData[4]);

        this.add(cur);
    }

索引从 0 开始,所以我认为正确的代码应该是

while ((line = reader.readLine()) != null) {

        String[] RowData = line.split(",");
        if(RowData.length <4)
             continue;
        DataStates cur = new DataStates();
        cur.setTitle(RowData[1]);
        cur.setPrice(RowData[2]);
        cur.setDescription(RowData[3]);

        this.add(cur);
    }

【讨论】:

  • 应用程序在启动时仍然崩溃。
  • 好的,在您读取 RowData 之前,您必须检查它的大小是否为 4 或更大 if(RowData.length &gt;=4){。如果 RowData 的大小不是 4 或更大,则应跳过此行。这行可能是空的吗?
  • 我检查了您的 csv 文件,发现最后一行是空行。因为没有','line.split(",") 将返回一个类似{""} 的字符串数组。我已经编辑了我的帖子,所以代码不会再次崩溃
  • 我已将我的 csv 更改为为最后 3 个条目留出一个空白空间,并为您的条目换了代码,但它显示内部没有数据显示。
  • 我会检查它读取的内容以及是否添加了 System.out. 的内容,以便您查看失败的位置
【解决方案2】:

你需要更换

cur.setTitle(RowData[2]);
cur.setPrice(RowData[3]);
cur.setDescription(RowData[4]);

cur.setTitle(RowData[1]);
cur.setPrice(RowData[2]);
cur.setDescription(RowData[3]);

您在 RowData 中只有 4 个值,您正在尝试访问第 5 个值。

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4

您需要考虑索引 0 到 3。而不是 1 到 4。

希望这会有所帮助。

【讨论】:

  • 应用程序在启动时仍然崩溃。
  • 请发布有问题的新崩溃日志。 @UrbanChrisy
  • @UrbanChrisy 在String[] RowData = line.split(","); 之后添加System.ut.println("Size of RowData: " +RowData.length); 并在控制台中检查其大小。
【解决方案3】:

索引从 0 开始,所以

cur.setDescription(RowData[4]);

会导致 NPE,因为在您的 CSV 中您只有 4 列(索引为 0、1、2、3)。

在您的情况下,描述的索引是3

【讨论】:

  • 应用程序在启动时仍然崩溃。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多