できるだけ具体的にしようと思います。xml ファイルに取り込まれるカスタム オブジェクト クラスを作成しました。クラスはロボット用で、ロボットには武器や鎧などがあります。ロボットの各反復を配列リストに保存しています。次に、リスト ビュー (カスタム リスト アダプター) にロボットに関する情報を入力します。ロボットのさまざまな部分をクリックすると、それらのコンポーネントに取り付けられている武器や鎧などが表示されます。これはすべて正常に機能し、どういうわけかランダムに機能しなくなりました。アクティビティ間で渡されるときにアプリがデータを失っているか、GC が一部のデータを削除しているようです。突然間違ったデータが表示されたり、データが欠落したりする理由を突き止めようとして、私は髪を引っ張っています。ここにコードを投稿できればいいのにと思いますが、実際にはアプリ全体でこの問題が発生しています。私の質問だと思います。カスタムオブジェクトを配列リストに適切に保存していますか? または彼らの別の方法です。以前は機能していたため、どこからデバッグを開始すればよいかさえわかりません。
private Mech loadMDF(Mech mech) {
MechComponents mechComponents = null;
String mechfile = "";
String name = "";
float HP = 0;
int maxSlots = 0;
try {
XmlPullParserFactory factory;
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
// FileInputStream fis = new FileInputStream(file);
// set the input for the parser using an InputStreamReader
// xpp.setInput(new InputStreamReader(fis));
xpp.setInput(getResources().getAssets().open(mech.mdf), null);
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equals("MechDefinition")) {
for (int i = 0; i < xpp.getAttributeCount(); i++) {
if (xpp.getAttributeName(i).equals("HardpointPath")) {
boolean found = false;
String[] theFilename = xpp.getAttributeValue(i)
.split("/");
for (int n = 0; n < MechHardPointFiles.size(); n++) {
if (MechHardPointFiles.get(n).equals(
theFilename[theFilename.length - 1])) {
found = true;
}
}
if (!found) {
MechHardPointFiles
.add(theFilename[theFilename.length - 1]);
loadMechFile(theFilename[theFilename.length - 1]);
}
mechfile = theFilename[theFilename.length - 1];
}
}
}
if (xpp.getName().equals("Mech")) {
for (int i = 0; i < xpp.getAttributeCount(); i++) {
if (xpp.getAttributeName(i).equals("MaxTons")) {
mech.MaxTons = Float.parseFloat(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("BaseTons")) {
mech.BaseTons = Float
.parseFloat(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("CanEquipECM")) {
mech.setCanEquipECM(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("MaxJumpJets")) {
mech.MaxJumpJets = xpp.getAttributeValue(i);
}
if (xpp.getAttributeName(i).equals("LeftArmAim")) {
// mech.MaxTons =
// Float.parseFloat(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("RightArmAim")) {
// mech.MaxTons =
// Float.parseFloat(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("MinEngineRating")) {
mech.MinEngineRating = Integer.parseInt(xpp
.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("MaxEngineRating")) {
mech.MaxEngineRating = Integer.parseInt(xpp
.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("MaxJumpJets")) {
mech.setCanEquipECM(xpp.getAttributeValue(i));
}
}
}
if (xpp.getName().equals("Component")) {
mechComponents = new MechComponents();
for (int i = 0; i < xpp.getAttributeCount(); i++) {
if (xpp.getAttributeName(i).equals("Name")) {
name = helperObjects.checkForSpace(xpp
.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("HP")) {
HP = Float.parseFloat(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("Slots")) {
maxSlots = Integer.parseInt(xpp.getAttributeValue(i));
}
}
}
if (xpp.getName().equals("Internal")) {
for (int i = 0; i < xpp.getAttributeCount(); i++) {
if (xpp.getAttributeName(i).equals("Name")) {
mechComponents.addToSlot(xpp.getAttributeValue(i));
}
}
}
if (xpp.getName().equals("Hardpoint")) {
int hpType = 0;
int hpSlots = 0;
for (int i = 0; i < xpp.getAttributeCount(); i++) {
if (xpp.getAttributeName(i).equals("Type")) {
hpType = Integer.parseInt(xpp.getAttributeValue(i));
}
if (xpp.getAttributeName(i).equals("ID")) {
for (int f = 0; f < MechHardPoints.size(); f++) {
if (MechHardPoints.get(f).hpFile.equals(mechfile)) {
if (MechHardPoints.get(f).id == Integer
.parseInt(xpp.getAttributeValue(i))) {
hpSlots = MechHardPoints.get(f).Slots;
break;
}
}
}
}
}
mechComponents.addHardPointRestriction(new HardPointRestriction(
hpType, hpSlots));
}
} else if (eventType == XmlPullParser.END_TAG) {
if (xpp.getName().equals("Component")) {
mechComponents.name = name;
mechComponents.HP = HP;
mechComponents.maxSlots = maxSlots;
mech.components.add(mechComponents);
Log.i("mwo_app",
"Hard Point Check: "
+ Integer.toString(mechComponents
.getHardPointRestrictions().size()));
}
} else if (eventType == XmlPullParser.TEXT) {
}
eventType = xpp.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mech;
}
これは、アクティビティを切り替えるために使用する別のスニペットです
inte = new Intent(MainActivity2.this, MechView.class);
Bundle b = new Bundle();
b.putSerializable("com.typhonpacific.mwoapp.mech",
mechListAdapter.getItem(arg2));
inte.putExtras(b);
startActivity(inte);