I wanted to try creating a TableRow with a small group of TextViews, each of them holding a primitive String data. I thought, maybe if I store an ArrayList of these TableRows, and if successfully read/write back and forth, I would simplify a lot of time to create a datasheet or a chart on the Android screen.
By the look of it, I feel like I would have to make a lot of subclasses of the Views, and implement Serializable to all of them. It is totally beyond my ability.
My main question is: Is it possible to store a group of TextView into a TableRow, create an array full of TableRows, and individually add each one of them into a TableLayout?
So far, I can't go beyond saving the data with the use of ObjectOutputStream, as it keeps throwing NotSerializableException, InvalidAccessException, IllegalAccessException, EOFException, IOException, etc., all sorts of different exceptions.
If my concept is not very good, may I ask where should I need to rethink this? What should I change, and how should I store groups of data? Thanks in advance.
Without further ado, here's my code that I use to try and save an ArrayList of TableRows, and all the mumbo-jumbo I've been working on for the past 12 hours, non-stop.
package tt.tt;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
public class Test extends Activity implements OnClickListener, Serializable {
private static final long serialVersionUID = 2466231508464769438L;
public class Format implements Serializable {
private static final long serialVersionUID = 1L;
public String name;
public long points;
public int position;
}
List<Format> formats = new ArrayList<Format>();
TableRow row;
TableLayout layout;
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.table);
layout = (TableLayout) this.findViewById(R.id.table);
Button make = (Button) this.findViewById(R.id.make);
make.setOnClickListener(this);
Button retrieve = (Button) this.findViewById(R.id.retrieve);
retrieve.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.make:
make();
break;
case R.id.retrieve:
retrieve();
break;
}
}
public void make() {
Random r = new Random();
Format f = new Format();
f.name = r.toString();
f.points = r.nextLong();
f.position = r.nextInt(10);
formats.add(f);
FileOutputStream out;
try {
out = this.openFileOutput("format", Activity.MODE_PRIVATE);
ObjectOutputStream output = new ObjectOutputStream(new BufferedOutputStream(out));
output.writeObject(formats);
output.flush();
output.close();
}
catch (FileNotFoundException e) {
Log.d("Test", "Can't save data", e);
}
catch (IOException e) {
Log.d("Test", "Can't save data", e);
}
TextView text = new TextView(this);
text.setText(Integer.toString(f.position));
row = new TableRow(this);
row.addView(text, 0, TableRow.LayoutParams.WRAP_CONTENT);
text = new TextView(this);
text.setText(f.name);
row.addView(text, 1, TableRow.LayoutParams.WRAP_CONTENT);
text = new TextView(this);
text.setText(Long.toString(f.points));
row.addView(text, 2, TableRow.LayoutParams.WRAP_CONTENT);
layout.addView(row);
}
public void retrieve() {
layout.removeAllViews();
FileInputStream in;
try {
in = this.openFileInput("format");
ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(in));
List<Format> temp = (List<Format>) input.readObject();
input.close();
}
catch (FileNotFoundException e) {
Log.d("Test", "Can't load data", e);
}
catch (StreamCorruptedException e) {
Log.d("Test", "Can't load data", e);
}
catch (IOException e) {
Log.d("Test", "Can't load data", e);
}
catch (ClassNotFoundException e) {
Log.d("Test", "Can't load data", e);
}
}
}
Unfortunately, when I reach this line here:
output.writeObject(formats);
It throws out an error, retrieved from Logcat:
09-22 14:50:43.658: D/Test(29362): Can't save data
09-22 14:50:43.658: D/Test(29362): java.io.NotSerializableException: android.widget.TableLayout
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362): at java.util.ArrayList.writeObject(ArrayList.java:644)
09-22 14:50:43.658: D/Test(29362): at java.lang.reflect.Method.invokeNative(Native Method)
09-22 14:50:43.658: D/Test(29362): at java.lang.reflect.Method.invoke(Method.java:511)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362): at tt.tt.Test.make(Test.java:75)
09-22 14:50:43.658: D/Test(29362): at tt.tt.Test.onClick(Test.java:55)
09-22 14:50:43.658: D/Test(29362): at android.view.View.performClick(View.java:3549)
09-22 14:50:43.658: D/Test(29362): at android.view.View$PerformClick.run(View.java:14400)
09-22 14:50:43.658: D/Test(29362): at android.os.Handler.handleCallback(Handler.java:605)
09-22 14:50:43.658: D/Test(29362): at android.os.Handler.dispatchMessage(Handler.java:92)
09-22 14:50:43.658: D/Test(29362): at android.os.Looper.loop(Looper.java:154)
09-22 14:50:43.658: D/Test(29362): at android.app.ActivityThread.main(ActivityThread.java:4945)
09-22 14:50:43.658: D/Test(29362): at java.lang.reflect.Method.invokeNative(Native Method)
09-22 14:50:43.658: D/Test(29362): at java.lang.reflect.Method.invoke(Method.java:511)
09-22 14:50:43.658: D/Test(29362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-22 14:50:43.658: D/Test(29362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-22 14:50:43.658: D/Test(29362): at dalvik.system.NativeStart.main(Native Method)