Androidアプリ作成日記

プログラミング初心者が、Androidアプリを作ります

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

家計簿アプリその13、ListViewの項目削除

さてさて、やっとこさ解決できましたんで更新です。

まず、今までのリストビューの表示方法だと、空白とかがあって処理がしにくかったんで、
項目と内訳を一行にまとめました。

20110424_1

あ、背景はやっぱとりあえず黒に変えました。白が背景だと後術のダイアログの表示が
なんか変な事になったからです。デザイン系は最後にまとめてやろうかと思ってます。


で、これをクリックした時の処理を書きます。
ListView list1 = (ListView) findViewById(R.id.list1);
adapter = new ArrayAdapter(this, R.layout.list);
list1.setAdapter(adapter);
list1.setOnItemClickListener(new ClickEvent());
まずコンポーネントを設定し、クリック処理をsetOnItemClickListenerメソッドに記述します。
public void onItemClick(AdapterView adapter, View view, final int arg2,long arg3) {
	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(Kakeibo.this);

	//ダイアログのタイトルとメッセージを設定
	alertDialogBuilder.setTitle("削除しますか?");
	final TextView textview = (TextView)view;
        alertDialogBuilder.setMessage(textview.getText());

       //タッチしたリストを取得
        final ListView list = (ListView)adapter;
        final String item = (String)list.getItemAtPosition(arg2);

	//削除ボタンを押した時にリストビューを削除
	alertDialogBuilder.setPositiveButton("削除",new DialogInterface.OnClickListener() {
		public void onClick(DialogInterface dialog, int which) {
			ArrayAdapter adapter = (ArrayAdapter)list.getAdapter();
			adapter.remove(item);
		}
	});
これは特定のリストを押した時の、そのリストを削除するプログラミングです。
20110424_2
こんなダイアログ画面が出ます。
ちなみにarg2でリストのidを取得しています。これは後で使います。
ですがこれだけだと、データベース上のデータは残ってるため、そっから削除する必要があります。
この方法をずいぶんと悩んでいたんですが、少し複雑な方法でデータベースのidを振り直す事にしました。
//カーソル設定の部分。
int change1=100;
while (isEof) {
	db.execSQL("update "+"'"+tablename+"'"+" set _id = '"+change1+"' WHERE (_id="+c.getInt(0)+")");
	change1+=1;
	isEof = c.moveToNext();
}
isEof=c.moveToFirst();
change1=100;
int change2=1;
while (isEof) {
	db.execSQL("update "+"'"+tablename+"'"+" set _id = '"+change2+"' WHERE (_id="+change1+")");
	change1+=1;
	change2+=1;
	adapter.add("["+c.getString(1)+"]"+c.getString(2)+":"+String.valueOf(c.getInt(3))+"円");
        sort=c.getString(1);
        goukei=goukei+c.getInt(3);
        isEof = c.moveToNext();
}
db.execSQLのupdate文で、データベース上のidを振り直します。
でも普通に振り直したらうまくいかず、なんでかというと例えばidが3のを2に振り直すと、
その下にidが2のものがあるとエラーが出てしまうのです。つまり、データベース上のidが
1
3
2
って順番で並んでる時、これを上から順に1,2,3と直そうとすると、
1←1
3←2
2←??前のとカブる?
ってな感じで、まぁよく分からないんですがこのままじゃうまくいかない訳です。
これを解決するためにidをいったん100以降の数字に振り分けて、それを1,2,3と
振り分ける、という2段階でやるようにしました。

[1段階]
1←100
3←101
2←102

[2段階]
100←1
101←2
102←3
こうやれば無事にうまく行きました。さすがに100個以上リストを一画面で使う事は考えにくいんで、
100以降にしました。こうする事によって、リストビューのidと一致させました。
で、次にデータベース上のidを消す処理をします。合計の値も変更します。

//ClickEventクラス内
public void onClick(DialogInterface dialog, int which) {

	//データベースを開く設定
	String tablename=String.valueOf(year)+"-"+String.valueOf(month+1)+"-"+String.valueOf(day);
	SubOpenHelper helper = new SubOpenHelper(getApplicationContext(),"kakeibo.db",1);
	SQLiteDatabase db;
	db = helper.getWritableDatabase();

	//変数の設定(arg2はリストビューのid。上からの番号)
	int x=arg2+1, z = 0;
	String[] cols = {"_id","Koumoku","Utiwake","Kingaku"};
	String selection = "_id = "+x;

	//タッチしたリストの行をカーソルのselectionで選択
	Cursor c = db.query("'"+tablename+"'",cols,selection, null, null, null, null,null);
	c.moveToFirst();
	//タッチしたリストの行の金額の値を取得
	z=c.getInt(3);

	//データベース上から削除
	db.execSQL("delete from'"+tablename+"'where(_id='"+x+"');");

	//合計から削除した金額を引く
	goukei=goukei-z;
	text_goukei.setText("合計:"+String.valueOf(goukei)+"円");
}
とまぁidさえ分かってしまえば後はdelete文で消すだけです。
では試しに消してみます。

20110424_3

合計を引くのがちょっと手こずりましたがなんとかできました。

今回は今までで一番苦戦したかもしれません。ちょっとハードルが高かったです。
解決策もかなり強引で、これは全然王道ではないでしょう。。
ていうか、そもそもここまで苦労してソートする必要性があったのかどうかって感じですが。
まぁなんにせよこれで次にいけます。次は口座管理。こりゃまた骨が折れそうだ~


Androidアプリ開発ランキング

  1. 2011/04/24(日) 22:46:01|
  2. 家計簿アプリ
  3. | トラックバック:0
  4. | コメント:0
<<GWだぜ~~~~! | ホーム | twitter>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://andromaker.blog98.fc2.com/tb.php/58-cc5d1950
この記事にトラックバックする(FC2ブログユーザー)


カテゴリ

家計簿アプリ (15)
アプリ作成 (練習) (7)
プログラム用語 (1)
エラー (3)
環境設定 (8)
サイト関連 (3)
雑談 (9)
ニュース (1)
未分類 (2)
書籍紹介 (1)
iPhone (1)

Android書籍

スマートにプログラミング
Android入門編


初歩からわかるAndroid
最新プログラミング


Google Android
プログラミング入門


AndroidアプリUIデザイン
&プログラミング


Android SDK
逆引きハンドブック

月別アーカイブ

最新コメント

最新トラックバック

最新記事

RSSリンクの表示

カウンター

アクセスランキング

アクセスランキング

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。