mCursor = mDbHelper.fetchAllRows(); startManagingCursor(mCursor); ListAdapter adapter2 = new SimpleCursorAdapter (this,R.layout.listview, mCursor, DeliverAdapt.FROM, DeliverAdapt.TO); setListAdapter(adapter2);
listview를 보여주는 클래스에 있는 코드중 아답터를 구성하는 코드입니다.
여기에 체크박스를 붙이려고 하는데, 영 되지가 않습니다. ㅠ
예제들을 보면rraryAdapter를 써서 하던데, 전 DB를 불러와서 해야하기때문에,
SimpleCousorAdapter를 써서하기때문에, 안되는건지, ㅠ
체크박스를 항목마다 붙여서 체크해서 삭제기능을 넣고 싶은데 어찌 해야할까요. ㅠㅠ
이게 첫번째 질문입니다.
두번째 질문은
mCursor = mDbHelper.fetchAllRows(); startManagingCursor(mCursor); ListAdapter adapter2 = new SimpleCursorAdapter (this,R.layout.listview, mCursor, DeliverAdapt.FROM, DeliverAdapt.TO); setListAdapter(adapter2);
첫번째와 같은 소스인데요, 이 소스는 첫번째 listview 클래스이고, 두번째 클래스(input.class)에, save 버튼이있습니다.
버튼을 클릭하면 첫번째 클래스에 listview가 클릭이벤트에 반응하여 리스트를 다시 뿌려주는 이벤트를 주고 싶습니다.
notifyDataSetChanged();
이용을 못하고 있습니다.
아님 다른 좋은 방법이 있는건지. ㅠㅠ
능력밖인지.. 현재 강좌를 봐서는 해결이 되지 않습니다. ㅠ
고수분들 조언 부탁드립니다.
답변감사드립니다. 두분의 말씀을 인용하려고 한느데요.
mCursor.requery(); 입력받는 클래스에서 버튼을 클릭하는 부분에 넣으면, 에러가 납니다.
ㅠㅠ 어찌된것인지,
아, 그리고, 첫번째 질문내용은 각각의 리스트 항목에 버튼을 주어서 처리하려고 하는데요,
버튼1, 버튼2 로 해서 삭제, 수정을 만들어서 이벤트를 주려고 하는데, 가능한가요?
일단 버튼은 생성이 되었습니다 ㅠ
오~ 그런 방법이 있었군요.
근데, 만들었는데, 다이얼로그 창을 띄우긴 했는데,
그 버튼의 기능에, 해당 ID를 찾아서 그 ID를 가진 데이터를 지워야하는데,
어려움이 많네요, ㅠ 생성해놓은 DB아답터에 DELETE메소드는 만들어놨는데,
그 아이템을 클릭할때 ID도 얻어와야하는 구문도 잘 모르겠고. ㅠㅠ
조언부탁드립니다. ㅠㅠ
어렵네요.. ㅠ
ListAdapter adapter2 = new SimpleCursorAdapter
(this,R.layout.listview, mCursor, DeliverAdapt.FROM, DeliverAdapt.TO);
setListAdapter(adapter2);
이렇게 만들어진 아답터를 이용해야 하는데,
adapter2).setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(
AdapterView<?> parent, View view, int position, long id) {
// Check for delete button
final long deletePetId = id;
rowId = parent.getItem(position);
// Use an Alert dialog to confirm delete operation
new AlertDialog.Builder(List.this)
.setTitle("DB자료 삭제")
.setMessage("선택하신 자료를 삭제하시겠습니까?")
.setPositiveButton("삭제", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mDbHelper.deleteRow(deletePetId);
// mCursor.requery();
}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Refresh the data in our cursor and therefore our List
}
})
.show();
이런식으로 표현하니 오류가 많아서 ㅠㅠ
참고할만한 예제나 소스가 없을까요..? ㅠ
manageDlg.setNeutralButton("Delete", new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
DBAdaptor.deleteWord(wordCur.getString(wordCur.getColumnIndexOrThrow(DBAdaptor.WORD_KEY_COLUMN1))
,wordCur.getString(wordCur.getColumnIndexOrThrow(DBAdaptor.WORD_KEY_COLUMN2)));
wordCur.requery();
}
});
별로 어렵지는 않아요 생각해보시면; 제 코드 올립니다..다이얼로그창위의 삭제버튼에 해당하는 코드에요
ListView lv= (ListView) findViewById(android.R.id.list); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick( AdapterView<?> parent, View view, int position, long id) { // Check for delete button final long deletePetId = id; // Use an Alert dialog to confirm delete operation new AlertDialog.Builder(List.this) .setTitle("DB자료 삭제") .setMessage("선택하신 자료를 삭제하시겠습니까?") .setPositiveButton("수정", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton("삭제", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mDbHelper.deleteRow(deletePetId); mCursor.requery(); } }) .show();
감사합니ㅏ.
위와 같이 해결하였습니다.
제 방법도 괜찮은 건지요? 삭제가 되는것 같긴한데, 님께서 가르켜주신 방법과 다른방법이라..
이게 제대로 되는건지.. ㅎ
근데 또 다른 문제점이..ㅡ.,ㅡ
인지하지 않았던 부분인데, 데이터를 입력하면 row가 자동으로 증가해서 1,2,3,4,5,6이런순서로 입력되는데,
만약 해당 포지션 2번을 선택한것을 삭제하면 1,3,4,5,6
이렇게 리스트에 남아있을것이고,, 또 여기에 데이터를 추가하면 7번부터 입력이 됩니다.
그럼 테이블에 계속 row는 카운트가 증가만 하고 그 사이에 삭제로 지워진 rowID는 갈곳을 잃는데...
만약 데이터들을 다지우고 다시 데이터를 입력하면.. 8번부터 ROWID 카운트가 증가합니다..
음..이건 어쩔 수 없는건가요? ㅠㅠ
아.. SQLITE3로 삭제 되는것 확인했습니다 ㅠ
아~ 정말 감사합니다.
근데, requery() 메소드를 simplecoursor로 한다는 말씀은
커서를 다시 설정해야한다는것인가요?
coursor dbcoursor; ->> simpleCoursor dbcousor;
이런식으로 선언 하라는 것인지요?
이 작성하신 코드의 경우 this.R.layout.listview 이니 해당 Layout 에 체크 박스를 넣으시면 체크박스가 보이실 듯 하구요, listView 의 setOnItemClickListener 를 이용해서 해당 아이템이 선택되는 경우 콜백을 받으실 수 있을 것 같습니다. 이 때, 선택된 아이템 정보를 따로 관리해 두고, SimpleCursorAdapter의
setViewBinder()로 등록할 ViewBinder 클래스에서 따로 저장해둔 값에 따라서 View에 속한 CheckBox의 Checked/Unchecked 상태를 변경하시면 되지 않을까 합니다.두번째 질문의 경우 특정 List 와 연결되어 있는 Adapter 에서 notifyDataSetChanged 를 호출해 주면 됩니다.
.notifyDataSetChanged() 가, GUI 이벤트를 발생함으로 GUI 스레드와 동일 스레드에서 호출해야 될거 같긴 한데 기억이 좀 가물가물 하네요.adapter