안드로이드 개발 질문/답변
(글 수 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 가 발생됩니다.




저도 매우 궁금한 부분입니다. 선배님들 좀 알려주세요 ㅜㅜ