私はxmlファイルを解析してdbに保存し、テーブルから特定のレコードを取得してリストビューに表示したいアプリを開発しています。それをクリックすると、その値をインテントを通じて次のアクティビティに渡します。私はそれを試しました。アプリケーションの.apkをインストールすると正常に動作しますが、リストビューアクティビティに戻って任意の値をクリックすると、「強制終了」としてエラーが発生し、アプリケーションが終了します。log cat では、以下のようなエラーが発生します。
データベースからレコードを取得し、毎回完全にリストビューに表示しています。エラーonclickイベントが発生しています。また、リストビューに戻ったときにも発生します。
問題を解決するのを手伝ってください...事前にありがとう...!
Logcat エラー
> *03-22 22:07:51.681: E/AndroidRuntime(336): FATAL EXCEPTION: main
03-22 22:07:51.681: E/AndroidRuntime(336): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
03-22 22:07:51.681: E/AndroidRuntime(336): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
03-22 22:07:51.681: E/AndroidRuntime(336): at java.util.ArrayList.get(ArrayList.java:311)
03-22 22:07:51.681: E/AndroidRuntime(336): at com.dod.test.List_of_Consumer$1.onItemClick(List_of_Consumer.java:130)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.widget.ListView.performItemClick(ListView.java:3513)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.os.Handler.handleCallback(Handler.java:587)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.os.Handler.dispatchMessage(Handler.java:92)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.os.Looper.loop(Looper.java:123)
03-22 22:07:51.681: E/AndroidRuntime(336): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-22 22:07:51.681: E/AndroidRuntime(336): at java.lang.reflect.Method.invokeNative(Native Method)
03-22 22:07:51.681: E/AndroidRuntime(336): at java.lang.reflect.Method.invoke(Method.java:507)
03-22 22:07:51.681: E/AndroidRuntime(336): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-22 22:07:51.681: E/AndroidRuntime(336): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-22 22:07:51.681: E/AndroidRuntime(336): at dalvik.system.NativeStart.main(Native Method)*
List_of_Consumer //データベースからレコードを取得してリストビューに表示する最初のアクティビティ。
package com.dod.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class List_of_Consumer extends Activity {
Button back;
Intent i;
TextView txt_xml;
String consumer_id,meter,or,current,s;
ListView lv;
ArrayList<String> cid;
ArrayList<String> a;
InputStream is;
DB_Adapter database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_of_consumer);
back = (Button)findViewById(R.id.btnback);
lv=(ListView)findViewById(R.id.lv);
database = new DB_Adapter(getApplicationContext(), "EBS", null, 1);
try
{
a = new ArrayList<String>();
if(database.count())
{
getxmldata();
}else
{
File xml = new File(Environment.getExternalStorageDirectory(), "t21.xml");
is = new FileInputStream(xml);
//is = new FileInputStream("/data/data/com.dod.test/t21.xml");
InputStreamReader isr= new InputStreamReader(is);
XmlPullParserFactory xf=XmlPullParserFactory.newInstance();
XmlPullParser xp=xf.newPullParser();
xp.setInput(isr);
int event=xp.getEventType();
while(event!=XmlPullParser.END_DOCUMENT)
{
if(event==XmlPullParser.START_TAG)
{
current=xp.getName();
}
else if(event==XmlPullParser.TEXT)
{
if(current.equals("consumerid"))
{
a.add(xp.getText());
consumer_id=xp.getText();
Toast.makeText(getApplicationContext(), consumer_id, Toast.LENGTH_SHORT).show();
}
else if(current.equals("meter"))
{
meter=xp.getText();
Toast.makeText(getApplicationContext(), meter, Toast.LENGTH_SHORT).show();
}
else if(current.equals("or"))
{
or=xp.getText();
database.addConsumer(consumer_id, meter,or);
database.close();
}
}
event=xp.next();
}
getxmldata();
}
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
String st=a.get(arg2);
Toast.makeText(getApplicationContext(), "Consumer:="+st, Toast.LENGTH_SHORT).show();
Intent i = new Intent(getApplicationContext(),Reading_Detail.class);
i.putExtra("key", st);
startActivity(i);
// TODO Auto-generated method stub
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i = new Intent(getApplicationContext(),Home.class);
startActivity(i);
finish();
}
});*/
}
public void getxmldata()
{
cid=database.get_consumer_id();
ArrayAdapter<String> aa = new ArrayAdapter<String>(getApplicationContext(), R.layout.row,R.id.txt,cid);
lv.setAdapter(aa);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.list_of_consumer, menu);
return true;
}
}
DB_Adapter //データベース ファイル
package com.dod.test;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DB_Adapter extends SQLiteOpenHelper {
public SQLiteDatabase db;
String s2,s3;
public static final String KEY_NAME = "USERNAME";
public static final String KEY_PASSWORD = "PASSWORD";
public static final String DATABASE_TABLE = "LOGIN";
public static final String DATABASE_TABLE1 = "CONSUMER";
public static final String DATABASE_TABLE2 = "CONSUMER_XML";
public DB_Adapter(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
arg0.execSQL("CREATE TABLE LOGIN(ID INTEGER PRIMARY KEY AUTOINCREMENT," +
"USERNAME TEXT NOT NULL," +
"PASSWORD TEXT NOT NULL)");
arg0.execSQL("CREATE TABLE CONSUMER(ID INTEGER PRIMARY KEY AUTOINCREMENT," +
"CONSUMER_ID INTEGER NOT NULL," +
"METER_NO INTEGER NOT NULL," +
"PREV_READING INTEGER NOT NULL," +
"CURR_READING INTEGER NOT NULL," +
"IMAGE TEXT NOT NULL," +
"STATUS INTEGER NOT NULL)");
arg0.execSQL("CREATE TABLE CONSUMER_XML(CONSUMER_ID INTEGER PRIMARY KEY NOT NULL," +
"METER_NO INTEGER NOT NULL," +
"PREV_READING INTEGER NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
arg0.execSQL("DROP TABLE IF EXIST LOGIN");
arg0.execSQL("DROP TABLE IF EXIST CONSUMER");
arg0.execSQL("DROP TABLE IF EXIST CONSUMER_XML");
onCreate(arg0);
}
public void addConsumer(String consumerid,String meter,String pr)
{
db=getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put("CONSUMER_ID", consumerid);
cv.put("METER_NO", meter);
cv.put("PREV_READING", pr);
db.insert(DATABASE_TABLE2, null, cv);
}
public boolean count()
{
Cursor c = getReadableDatabase().rawQuery("SELECT CONSUMER_ID FROM " + DATABASE_TABLE2,null);
if (c.getCount()>0)
return true;
return false;
}
public ArrayList<String> get_consumer_id()
{
ArrayList<String>names1=new ArrayList<String>();
Cursor c = getReadableDatabase().rawQuery("Select CONSUMER_ID from " + DATABASE_TABLE2, null);
c.moveToFirst();
do
{
String s1=c.getString(c.getColumnIndex("CONSUMER_ID"));
names1.add(s1);
}while(c.moveToNext());
return names1;
}
}