AndroidでTodoリストアプリを作ったのですが、
todoリストで一つのListが繰り返し表示されます
リストの追加でlistをinsertした場合も、リストの編集でリストをupdateした場合も、
ListViewが一つのList(同じ情報のもの)のみの繰り返しとなります。
mList.clearというコードが書いてあるのですが、表示されるListは、全部同じもので繰り返し表示されています。そして、リスト編集ボタンをおし、updateしようとすると、updateされます。
一方、mList.clearをコメントアウトすると、表示されるListは、複数の種類のListが表示されますが、リスト編集ボタンを押して、updateしようとしても、updateは、されません。
この下のコードは、メモをデータベース(SQLite)から取得し、mapに値を入れて、それを、ListViewで表示しているコードです。
java
1public class MainActivity extends AppCompatActivity { 2 // ListView 用アダプタ 3 SimpleAdapter mAdapter = null; 4 5 6 // ListView に設定するデーた 7 List<Map<String, String>> mList = null; 8 /////////////////////////////////////////////////////ここに宣言されているmListが原因? 9 10 //新しく追加ListView 11 ListView list=null; 12 13 //質問する前につ以下 14 SQLiteDatabase db=null; 15 16 17 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 25 MemoDBHelper memoDBHelper=new MemoDBHelper(this); 26 db=memoDBHelper.getWritableDatabase(); 27 28 29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ここCREATE_TABLE 30 //db.execSQL(CREATE_TABLE); 31 32 33 34 ListView list = (ListView) findViewById(R.id.listView); 35 mList = new ArrayList<Map<String, String>>(); 36 37 38 mAdapter = new SimpleAdapter(this, 39 mList, 40 //独自で定義したlayoutを適応する 41 android.R.layout.simple_list_item_2, 42 new String[]{"title", "content", "data"}, //Map側のkey 43 new int[]{android.R.id.text1, android.R.id.text2, R.id.eTxtData} //layout側のTextViewId 表示させたいMapのkey順に合わせる 44 ); 45 46 // ListView にアダプターをセット 47 list.setAdapter(mAdapter); 48 49 50 ///////////////////////////////////////////////この上でリストを表示してる、データベースにデータがあるから、表示がまちがえ? 51 52 53 // ListView のアイテム選択イベント 54 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 55 56 @Override 57 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 58 59 60 // 編集画面に渡すデータをセットし、表示 61 Intent intent = new Intent(MainActivity.this, EditActivity.class); 62 63 // //これは編集だから から文字にする 64 intent.putExtra("INSERT",""); 65 66 intent.putExtra("TITLE", mList.get(pos).get("title")); 67 intent.putExtra("CONTENT", mList.get(pos).get("content")); 68 intent.putExtra("DATA", mList.get(pos).get("data")); 69 70 71 String title1= mList.get(pos).get("title"); 72 String content1=mList.get(pos).get("content"); 73 String data1=mList.get(pos).get("data"); 74 String data2=data1.toString(); 75 76 String table2=UserContract.Users.TABLE_NAME; 77 //////////////////なぜかCOL_TITLEとかでなくTITLEで取得できる???????????? 78 79 String sql="SELECT * FROM " +table2 + 80 " WHERE TITLE = " +"'"+title1 +"'" + 81 " AND CONTENT ="+ "'"+content1 +"'"+ 82 " AND DATA =" +"'"+data2 +"'"; 83 84 //下のnullは条件の?の奴 85 Cursor c =db.rawQuery(sql,null); 86 87 88 if(c.moveToFirst()) { 89 String idd = c.getString(c.getColumnIndex(UserContract.Users._ID)); 90 91 //表示できてる 92 93 c.close(); 94 intent.putExtra("ID", idd); 95 //ここで IDにせっとし intentを飛ばしてる 96 } 97 98 startActivity(intent); 99 } 100 }); 101 102 // ListView をコンテキストメニューに登録 103 registerForContextMenu(list); 104 } 105 106 107 108 109 110 @Override 111 protected void onResume() { 112 super.onResume(); 113 114 //open helper 115 //open db memoDBHelperに変更 116 MemoDBHelper memoDBHelper=new MemoDBHelper(this); 117 SQLiteDatabase db=memoDBHelper.getWritableDatabase(); 118 119 120 // ListView 用アダプタのデータをクリア 121 mList.clear(); 122 /////////////////////////////////////////////////////////このclearがいけないのか? 123 124 125 String id=null; 126 String title = null; 127 String content = null; 128 String data=null; 129 130 131 String table2=UserContract.Users.TABLE_NAME; 132 String sql="SELECT * FROM " +table2 ; 133 134 135 136 137 //下のnullは条件の?の奴 138 Cursor c =db.rawQuery(sql,null); 139 140 Log.v("DB_TEST","Count:"+c.getCount()); 141 142 Map<String, String> map = new HashMap<String, String>(); 143 while(c.moveToNext()){ 144 145 //この下のこんな書き方にする必要ある? 146 //だからupdateされ無いんじゃん?わからん 147 title=c.getString(c.getColumnIndex(UserContract.Users.COL_TITLE)); 148 content=c.getString(c.getColumnIndex(UserContract.Users.COL_CONTENT)); 149 data=c.getString(c.getColumnIndex(UserContract.Users.COL_DATA)); 150 151 152 //このLog.vはデータベースからselectした情報をc.moveToNext()してる奴だから有効 153 //つまりデータベースにはしっかり入力できてるってこと 154 Log.v("DB_TESTここはMainActivity"," id: "+id+ "title: "+title+ " content: "+content+ " data: "+data); 155 //////////////////////////このログを見るといろいろ取得できてるなのに表示は同じもの 156 157 map.put("title", title); 158 map.put("content", content); 159 map.put("data",data); 160 mList.add(map); 161 162 //////////////////////////リストの表示が悪い?それかこの上のコード map.putのやつ 163 164 } 165 166 //ここで、addされたmListをlistViewに表示することをやるためにonCreateのん作業をメソッドで呼ぶ必要? 167 168 c.close(); 169 db.close(); 170 171 // ListView のデータ変更を表示に反映 172 mAdapter.notifyDataSetChanged(); 173 } 174 175
//EditActivity updateのコードを追加しました。
java
1// メニュー選択時の処理 2@Override 3public boolean onOptionsItemSelected(MenuItem item) { 4 5 //open helper 6 //open db memoDBHelperに変更 7 MemoDBHelper memoDBHelper = new MemoDBHelper(this); 8 SQLiteDatabase db = memoDBHelper.getWritableDatabase(); 9 10 11 Cursor c = null; 12 String title = null; 13 String content = null; 14 String data = null; 15 EditText eTxtTitle = null; 16 EditText eTxtContent = null; 17 EditText eTxtData = null; 18 19 //ここのidにcancelとupdateを入れる 20 switch (item.getItemId()) { 21 case R.id.action_can: 22 //キャンセルが押された場合 23 mNotSave = true; 24 this.finish(); 25 break; 26 27 case R.id.action_upd: 28 // タイトル、内容、実行日の追加 29 eTxtTitle = (EditText) findViewById(R.id.eTxtTitle); 30 eTxtContent = (EditText) findViewById(R.id.eTxtContent); 31 eTxtData = (EditText) findViewById(R.id.eTxtData); 32 33 title = eTxtTitle.getText().toString(); 34 content = eTxtContent.getText().toString(); 35 data = eTxtData.getText().toString(); 36 37 //if文で、たいとるがからの時は、保存しない 38 // タイトル、内容が空白の場合、保存しない 39 40 Intent intent = getIntent(); 41 //あえてinsertkに変更 42 String insertk = intent.getStringExtra("INSERT"); 43 44 //////////////////////////////////////////iddを取得してる 45 String idd=intent.getStringExtra("ID"); 46 47 48 if (title.isEmpty() || content.isEmpty()) { 49 Toast.makeText(this, R.string.msg_destruction, Toast.LENGTH_SHORT).show(); 50 51 } 52 53 if (insertk.length() == 0) { 54 55 //つまりinsertじゃない つまりupdate 56 try { 57 //書き換えをしていく 58 59 //MainActivityと同じ 60 String table2=UserContract.Users.TABLE_NAME; 61 62 63 64 String sql="UPDATE "+table2+ 65 " SET TITLE = "+"'"+title+"',"+ 66 " CONTENT = "+"'"+content+"',"+ 67 " DATA = "+"'"+data+"' "+ 68 "WHERE ID = "+"'"+idd+"'" ; 69 70 Cursor cc = db.rawQuery(sql,null); 71 72 if(cc.moveToFirst()) { 73 title = cc.getString(cc.getColumnIndex(UserContract.Users.COL_TITLE)); 74 content = cc.getString(cc.getColumnIndex(UserContract.Users.COL_CONTENT)); 75 data = cc.getString(cc.getColumnIndex(UserContract.Users.COL_DATA)); 76 Log.v("DB_TESTやーーーーーーーーーー"," id: "+idd+ " title: "+title+ " content: "+content+ " data: "+data); 77 78 79 } 80 81 Log.v("DB_TESTやーーーーーーーーんupdate"," id: "+idd+ " title: "+title+ " content: "+content+ " data: "+data); 82 //取得できてる、ちゃんと 83 84 85 //保存に成功しました。 86 Toast.makeText(this, R.string.msg_upd, Toast.LENGTH_SHORT).show(); 87 88 } catch (Exception e) { 89 //さっきのここ 90 System.out.println("Exception ErrorMessage = " 91 + e ); 92 Toast.makeText(this, "強制returnしましたよ。", Toast.LENGTH_LONG).show(); 93 } 94
回答2件
あなたの回答
tips
プレビュー