CSV到ListView问题

时间:2016-02-22 08:27:12

标签: android android-layout listview csv

我正在尝试在我正在构建的基本应用程序上应用教程作为学习Android Studio的方法,我正在做的一部分是使用ListView创建一个新窗口(活动)来查看以CSV格式保存的信息文件。当我加载主应用程序时,它很好,但当我点击按钮,假设我带到列表视图将显示CSV内容的新窗口时,应用程序停止(关闭)。

附上项目布局的屏幕截图,以及ListView所在的窗口。

以下是代码;

这是编写ListView代码的类中的代码,类名是LogerView,MainActivity类中有一个按钮,即应用程序的主窗口,它将调用LogerView;

public class LogerView extends AppCompatActivity {

CSVAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewer);
    ListView mList = (ListView) findViewById(R.id.mList);

    mAdapter = new CSVAdapter(this, -1);

    mList.setAdapter(mAdapter);
    mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View v, int pos, long id) {
        Toast.makeText(v.getContext(), mAdapter.getItem(pos).getListCode(), Toast.LENGTH_SHORT).show();

            }
        }
    );
}


public void toasting(String msg) {
    Toast.makeText(LogerView.this, msg, Toast.LENGTH_SHORT).show();

}


public void switchToMain(View v) {
    Intent MainActivity = new Intent(this, MainActivity.class);
    startActivity(MainActivity);
}

}

这是CSVAdapter中的代码:

public class CSVAdapter extends ArrayAdapter<fileView>{
Context ctx;

public CSVAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);

    this.ctx = context;

    loadArrayFromFile();
}

@Override
public View getView(final int pos, View convertView, final ViewGroup parent){

    TextView mView = (TextView)convertView;

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

    mView.setText(getItem(pos).getListCode());
    mView.setText(getItem(pos).getListNumber());
    mView.setText(getItem(pos).getListRadio());
    mView.setText(getItem(pos).getListCheckBox());
    mView.setText(getItem(pos).getListNoteText());
    mView.setText(getItem(pos).getListTime());

    return mView;
}

private void loadArrayFromFile(){
    try {
        String FILENAME = "entry_log.csv";
        InputStream is = ctx.openFileInput(FILENAME);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;

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

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

            if (RowData.length < 6) {
                Log.e("SOME_TAG", "Invalid or empty line! . . .");
                continue;
            } else {
                fileView cur = new fileView();
                cur.setListCode(RowData[0]);
                cur.setListNumber(RowData[1]);
                cur.setListRadio(RowData[2]);
                cur.setListCheckBox(RowData[3]);
                cur.setListNoteText(RowData[4]);
                cur.setListTime(RowData[5]);

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

}

我将PltInfo类重命名为fileView,代码为:

package net.testerapp.loger;

public class fileView {
private String listCode, listNumber, listRadio, listCheckBox, listNoteText, listTime;


public String getListCode() {
    return listCode;
}

public void setListCode(String listCode) {
    this.listCode = listCode;
}

public String getListNumber() {
    return listNumber;
}

public void setListNumber(String listNumber) {
    this.listNumber = listNumber;
}

public String getListRadio() {
    return listRadio;
}

public void setListRadio(String listRadio) {
    this.listRadio = listRadio;
}

public String getListCheckBox() {
    return listCheckBox;
}

public void setListCheckBox(String listCheckBox) {
    this.listCheckBox = listCheckBox;
}

public String getListNoteText() {
    return listNoteText;
}

public void setListNoteText(String listNoteText) {
    this.listNoteText = listNoteText;
}

public String getListTime() {
    return listTime;
}

public void setListTime(String listTime) {
    this.listTime = listTime;
}

}

MainActivity Code如下所示,到目前为止,这个以完美的方式运行,保存信息,清除文本,但是当点击视图按钮时,应切换到PltInfo类以显示ListView,应用程序的位置关掉。 (不对本规范进行任何更改)*

我的CSV文件不在教程的Assets文件夹中,我在此路径模拟器上通过Android设备监视器查看它/ data / data / net.testerapp.loger / files / entry_log.csv

所以我创建了一个字符串FILENAME = entry_log.csv; 并在InputStream为= ctx.openFileInput(FILENAME)之后将其放在代码中;

不确定这是否是问题以及如何解决? 再加上ListView布局,它没有很好地组织,它会显示所有项目,我只是想先测试它,通过显示教程中的第一个项目,但没有在窗口中午餐,以便从重新组织列表的布局...任何有关如何解决这个问题的指导都将受到赞赏。 该教程的链接是:https://www.youtube.com/watch?v=S8_HnA7aLd0

**取消logcat条目,因为我现在没有收到错误enter image description here [![在此处输入图片说明] [2]] [2] [![在此处输入图像说明] [3]] [3]

好吧,我仔细阅读了教程中的步骤并重新编写了它,这次我没有得到任何错误,但仍然没有来自应用程序的响应,我是苹果在击中后切换到MainActivity的下一个窗口活动视图按钮,但然后在第二个窗口,我得到一个空的空间,没有列表,我确保布局中的列表,列表的ID匹配代码中的内容,但不知道为什么它不适用代码!?

我在主帖中编辑了我现在所拥有的代码,并附上了该应用的当前屏幕截图。

最后一件事是查看器布局.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">


<ListView
    android:layout_width="wrap_content"
    android:layout_height="235dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:id="@+id/mList" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="View File"
    android:id="@+id/ViewFileBtn"
    android:layout_marginTop="60dp"
    android:layout_gravity="center"
    android:onClick="ViewFile" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Back"
    android:id="@+id/BackBtn"
    android:layout_gravity="center|bottom"
    android:onClick="switchToMain" />
</LinearLayout>

[在此处输入图像说明] [4]

我试图在这里理解这个问题,等待一些帮助,这里是我运行调试器的一些屏幕截图,我不是很熟悉,因此有点失去了试图理解线程。

[![在此处输入图片说明] [5]] [5] [在此处输入图像说明] [6]

3 个答案:

答案 0 :(得分:1)

来自例外:

  

引起:java.lang.ArrayIndexOutOfBoundsException:length = 1;索引= 1   在   net.testerapp.loger.CSVAdapter.loadArrayFromFile(CSVAdapter.java:103)

它表示您正在尝试读取索引1处的数组项,而该数组在该位置没有项目 即:数组长度短于您尝试读取的位置。

要避免这种情况,请在创建RowData对象之前检查PltInfo长度 方法loadArrayFromFile()

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

    //Split to separate the name from the capital
    String[] RowData = line.split(",");

    if(RowData.legth<6){
        Log.e("SOME_TAG","invalid or empty line! skipping...");
        continue;
    }else{
        //Create a State object for this row's data.
        PltInfo cur = new PltInfo();
        cur.setEntryCode(RowData[0]);
        cur.setEntryNum(RowData[1]);
        cur.setSelected(RowData[2]);
        cur.setCheckBoxText(RowData[3]);
        cur.setNoteText(RowData[4]);
        cur.setGetNow(RowData[5]);

        //Add the State object to the ArrayList (in this case we are the ArrayList).
        this.add(cur);
    }
}

答案 1 :(得分:0)

我认为崩溃的原因是你在主线程上执行 loadArrayFromFile ,这是一个长时间运行的过程,因为它涉及打开和读取文件。尝试在AsyncTask中包装 loadArrayFromFile ,最好将其移出Adapter类。

**

  

修改

** 您可以像这样实现AsyncTask:

private class OpenFileTask extends AsyncTask<Void, Void, ArrayList<PltInfo>> {
     protected Long doInBackground(Void... params) {
         ArrayList<PltInfo> data=loadArrayFromFile();
         return data;
     }

     private void loadArrayFromFile(){
    try {
        ArrayList<PltInfo>data=new ArrayList<PltInfo>();
        // Get input stream and Buffered Reader for our data file.
        String FILENAME = "entry_log.csv";
        InputStream is = ctx.openFileInput(FILENAME);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;

        //Read each line
        while ((line = reader.readLine()) != null) {

            //Split to separate the name from the capital
            String[] RowData = line.split(",");

            //Create a State object for this row's data.
            PltInfo cur = new PltInfo();
            cur.setEntryCode(RowData[0]);
            cur.setEntryNum(RowData[1]);
            cur.setSelected(RowData[2]);
            cur.setCheckBoxText(RowData[3]);
            cur.setNoteText(RowData[4]);
            cur.setGetNow(RowData[5]);

            //Add the State object to the ArrayList (in this case we are the ArrayList).
            data.add(cur);
        }
        return data;
    } catch (IOException e) {
        e.printStackTrace();
    }
}



     protected void onPostExecute(ArrayList<PltInfo> result) {
         if(result!=null){

         }
     }
 }

然后将数据传递给适配器,如下所示:

private ArrayList<PltInfo>mData;

public CSVAdapter(Context context, int textViewResourceId,ArrayList<PltInfo> data) {
    super(context, textViewResourceId);

    //Store a reference to the Context so we can use it to load a file from Assets.
    this.ctx = context;

    mData=data;
}

然后从您的活动中调用异步任务,如下所示:

OpenFileTask task=new OpenFileTask();
 task.execute();

答案 2 :(得分:0)

所以,问题解决了,而且CODE是合理的......文件必须再次上传,并且@Yazan提到的if语句真的有帮助...感谢Freenode#android-dev和Heor *** Zharf **坚持让我学习如何使用调试器并跟着我解决这个问题很明显。

必须承认,listview的结果不是预期的结果,我只需要仔细检查布局并弄清楚它有什么问题。

enter image description here