안드로이드 개발 질문/답변
(글 수 45,052)
List_View.java package com.Most_It;
import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.widget.BaseAdapter; import android.widget.SimpleAdapter;
public class TodoList { public BaseAdapter Adapter = null; //ADAPTER 객체 생성 private ArrayList<HashMap <String, String> > _DataSource = new ArrayList<HashMap <String, String> > (); private SQLiteDatabase _DB = null; //SQLite을 사용하기 위한 객체 생성 private Activity _Activity = null; //Main ACTIVITY 의미하는 ACTIVITY 객체 생성 private String msg = null; public TodoList(Activity AActivity) { super(); _Activity = AActivity; _DB = _Activity.openOrCreateDatabase("Natest", Context.MODE_PRIVATE, null); //_DB.execSQL("Create Table IF NOT EXISTS List (Num Integer Primary Key AUTOINCREMENT, Message varchar, Date varchar)"); _DB.execSQL("Create Table IF NOT EXISTS List ( Message varchar, Date varchar)"); Adapter = new SimpleAdapter ( _Activity, _DataSource, android.R.layout.simple_list_item_2, //new String[] {"SN", "Title"}, new String[] {"Message", "Date"}, new int[] { android.R.id.text1, android.R.id.text2 } ); Refresh(); } //SN필드의 마지막 레코드 값을 가져오기 위한 함수 /*public int getLastRowId() { Cursor _Cursor = _DB.rawQuery("Select last_insert_rowid() from List", null); if(_Cursor.moveToFirst()){ return _Cursor.getInt(0); //첫번째 필드를 가져옴 }else{ return -1; } }*/ public void Append(String text) { Calendar calendar = Calendar.getInstance(); String stime = String.format("%d년 %d월 %d일 %d시 %d분 %d초", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)); _DB.execSQL("Insert into List values ('"+text+"', '"+stime+"')"); //Hashmap으로 값저장 HashMap<String, String> _Item = new HashMap<String, String> (); //_Item.put("SN", Integer.toString(getLastRowId())); _Item.put("Message", text); _Item.put("Date", stime); _DataSource.add(_Item); Adapter.notifyDataSetChanged(); //값이 변경되면 UI에 바로 적용 } //Refresh //DB에 있는 DATA를 LISTVIEW로 출력해주기 위해 DATA를 가져오는 함수 public void Refresh() { Cursor _Cursor = _DB.rawQuery("Select * from List", null); if (_Cursor.moveToFirst()) { do{ HashMap<String, String> _Item = new HashMap<String, String> (); //_Item.put("SN", _Cursor.getString(0).toString()); //_Item.put("Title", _Cursor.getString(1).toString()); _Item.put("Message", _Cursor.getString(0).toString()); _Item.put("Date", _Cursor.getString(1).toString()); _DataSource.add(_Item); }while (_Cursor.moveToNext()); //레코드끝까지 커서 이동 } Adapter.notifyDataSetChanged(); //값이 변경되면 UI에 바로 적용 } }
TodiList.java
package com.Most_It;
//import com.Most_It.R; import com.Most_It.TodoList;
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; import android.app.*; import android.database.sqlite.SQLiteDatabase; import android.view.View.OnClickListener;
/* import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.widget.BaseAdapter; import android.widget.SimpleAdapter; */
public class List_view extends Activity { private ListView _ListView = null; private TodoList _TodoList = null; //private String msg = "lagunia";
private SQLiteDatabase _DB = null; //SQLite을 사용하기 위한 객체 생성 public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.list_view); _TodoList = new TodoList(this); //TodoList 객체 생성 //Button cancle_bt = (Button)findViewById(R.id.cancle); _ListView = (ListView) findViewById(R.id.ListView); //ListView 객체 생성 _ListView.setAdapter(_TodoList.Adapter); //ListView에 DB Adapter를 연결해 출력해줌 _ListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { new AlertDialog.Builder(List_view.this) .setTitle("날짜 입력부분") .setMessage("") //.setIcon(R.drawable.icon) .setPositiveButton("닫기", null) .show(); } });
} }
ArrayList<HashMap <String, String> >형태로 선언된
_DataSource 에 저장된 Message부분에 저장된 값을
다이얼로그로 뛰우고 싶은데 ArrayList<HashMap <String, String> >형태에선
어떻게 뛰워야 할지 난감하네요 좀 알려주세요 ^ㅡ^
2010.05.27 01:19:53
간단하게 하면
parent 라는 AdapterView 는 생성하신 _ListView 객체입니다.
그럼 parent.getAdapter() 는 생성하신 Adapter 를 return 해 주겠구요
해서 얻어오신 Adapter 에서 .getItem(position) 을 하시면 해당 touch 하신 위치의 Object..
그러니까 지금의 경우에는 HashMap<String, String> 을 받을 수 있습니다.
그럼 받아오신 HashMap 에서 .get("Message") 를 하시면 Message 에 저장된 값이 나오겠죠.
해보시고 결과 알려주세요 ^^ 틀렸을수도 있습니다.
2010.05.27 02:24:27
참.. ArrayList 를 사용하시려면 SimpleAdapter 보다 ArrayAdapter 를 사용하시길 권장합니다.
ArrayAdapter 를 사용하시면 따로 데이터가 변경되었을 때 notify 를 해 주지 않아도 스스로 notify 를 합니다
물론.. ArrayAdapter 를 만들 때 argument 로 넘겨준 ArrayList 에 바로 add 하는 케이스 말고
ArrayAdapter adapter = ~~~; 해서 만든 adapter 에
adapter.add(OBJECT) 로 추가하였을 때 notify 가 발생됩니다.
ArrayAdapter 를 사용하시면 따로 데이터가 변경되었을 때 notify 를 해 주지 않아도 스스로 notify 를 합니다
물론.. ArrayAdapter 를 만들 때 argument 로 넘겨준 ArrayList 에 바로 add 하는 케이스 말고
ArrayAdapter adapter = ~~~; 해서 만든 adapter 에
adapter.add(OBJECT) 로 추가하였을 때 notify 가 발생됩니다.
저도 매우 궁금한 부분입니다. 선배님들 좀 알려주세요 ㅜㅜ