我正在尝试在我正在构建的基本应用程序上应用教程作为学习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条目,因为我现在没有收到错误
[![在此处输入图片说明] [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]
答案 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)