AlarmMain.java
protected void init() {
// TODO Auto-generated method stub
try{
mCorsur = getAlarmCursorList(this); // 디비 호출
}catch(Exception e){
Log.e(TAG, "e "+e);
}
alarmCursorAdapter = new AlarmCursorAdapter(this, mCorsur); //커서어뎁터 생성
alarmCursorAdapter.notifyDataSetChanged();
alarm_list_view = (ListView)findViewById(R.id.alarm_list); // 리스트뷰 생성
alarm_list_view.setAdapter(alarmCursorAdapter);//커서어뎁터 셋
alarm_list_view.setOnItemClickListener(this); // 온클릭 이벤트
}
@Override
public void onItemClick(AdapterView parent, View view, int pos, long id) {
// TODO Auto-generated method stub
final Cursor cursor = (Cursor) alarm_list_view.getAdapter()
.getItem(pos);
Alarm alarm = new Alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(10), cursor.getString(11));
Intent intent = new Intent(AlarmMain.this, SetAlarm.class);
intent.putExtra(ALARMID, alarm.getId());
intent.putExtra(MODE, UPDATEMODE);
startActivity(intent);
}
======================================================================================
//커서어뎁터
public class AlarmCursorAdapter extends CursorAdapter{
public AlarmCursorAdapter(Context context, Cursor cursor) {
super(context, cursor);
// TODO Auto-generated constructor stub
mContext=context;
}
@Override
public void bindView( View view, final Context context, Cursor cursor) {
// TODO Auto-generated method stub
final Alarm alarm = new Alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(10), cursor.getString(11));
View indicator = view.findViewById(R.id.indicator);
final ImageView iv = (ImageView)indicator.findViewById(R.id.button_toggle);
boolean iv_toggle = Boolean.valueOf(alarm.getEnabled());
if(iv_toggle)iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_on));
else iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_off));
indicator.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(Boolean.valueOf(alarm.getEnabled())){
update_values(alarm.getId(), false); //db 업데이트 하는부분
}else{
update_values(alarm.getId(), true); //db 업데이트 하는부분
}
}
});
}
질문 드립니다.
update_values(alarm.getId(), false); 부분에서 디비를 업데이트를 하면
ListView를 갱신해서 아이콘 모양을 바꿔줘야되는데 안바뀜
ImageView 부분을 클릭하면 onItemClick 이벤트를 타지않음.
결론.
처음 디비를 읽어와 어뎁터를 생성하고, 뷰를 생성하여
생성된 뷰에 어뎁터를 넣어주었다.
현상태에서 리스트상의 item 일부분을 클릭하여
item에 해당하는 db를 업데이트 시켰다.
그러면. ListView에 알려줘서 db가 갱신됬으니 ListView도 갱신시켜줘야되는데 ListView가 안변한다.
AlarmMain.java 와 AlarmCursorAdapter.java는 서로 다른 클래스라 접근이 불가능하다.
그래서 사용한 방법이
AlarmMain.java에
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(ALARM_MAIN_REFRESH)){
Log.d(TAG, "ALARM_MAIN_REFRESH");
onResume();
}
}
};
를 생성한후
update_values(alarm.getId(), false);
Intent alarm_refresh = new Intent(ALARM_MAIN_REFRESH);
context.sendBroadcast(alarm_refresh);
를 하니 잘동작 하는듯 싶엇다.
그러나 ListView의 스크롤이 생겼을시 문제가 발생하였다.
꼼수를 부려도 안되서
여기에 질문드립니다.
ListView에 갱신된 db정보를 넣어주는 방법좀 알려주시기 바랍니다.
배지다라아님
alarmCursorAdapter.notifyDataSetChanged();
애를 어케호출해야될지를 모르겠습니다. ㅠㅠ
indicator.setOnClickListener 에서 AlarmMain.java에 있는 alarmCursorAdapter.notifyDataSetChanged();
호출 가능한지요???
indicator.setOnClickListener() 가 AlarmCursorAdapter 인스턴스에서 호출되는거 맞나요?
그러면
AlarmCursorAdapter.this.notifyDataSetChanged();
하면 될텐데...
notifyDataSetChanged() 만 써도 될것같구요..
registerObserver 와 contentprovider 에서 update, delete, insert 시 notify 를 주시고, observer -onChange 에서 Cursor.requery() 혹은 query 를 다시 해주시면 될겁니다.
커서 어뎁터
public class AlarmCursorAdapter extends CursorAdapter{
private Context mContext;
public AlarmCursorAdapter(Context context, Cursor cursor) {
super(context, cursor);
// TODO Auto-generated constructor stub
mContext=context;
}
@Override
public void bindView( View view, final Context context, Cursor cursor) {
// TODO Auto-generated method stub
final Alarm alarm = new Alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(10), cursor.getString(11));
View indicator = view.findViewById(R.id.indicator);
final ImageView iv = (ImageView)indicator.findViewById(R.id.button_toggle);
TextView alarm_time = (TextView)view.findViewById(R.id.time);
TextView alarm_days_of_week = (TextView)view.findViewById(R.id.days_of_week);
TextView alarm_message = (TextView)view.findViewById(R.id.message);
boolean iv_toggle = Boolean.valueOf(alarm.getEnabled());
if(iv_toggle)iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_on));
else iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_off));
alarm_time.setText((alarm.getHour()+":"+alarm.getMinutes()));
alarm_days_of_week.setText(alarm.getDays_of_week());
alarm_message.setText(alarm.getMessage());
indicator.setFocusable(false);
indicator.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(Boolean.valueOf(alarm.getEnabled())){
update_values(alarm.getId(), false);
//iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_off));
}else{
update_values(alarm.getId(), true);
//iv.setImageDrawable(context.getResources().getDrawable(R.drawable.alarm_on));
}
notifyDataSetChanged();
}
});
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// TODO Auto-generated method stub
View view = LayoutInflater.from(context).inflate(R.layout.alarm_row, parent, false);
return view;
}
}
AlarmMain.java
public class AlarmMain extends AdlibActivity implements OnItemClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_main);
initAds();
this.setAdsContainer(R.id.ads);
mContext = this;
mDBHelper = new DatabaseHelper(this, DatabaseHelper.DATABASE_NAME);
if(db == null){
db = mDBHelper.getWritableDatabase();
}
}
protected void init() {
// TODO Auto-generated method stub
try{
mCorsur = getAlarmCursorList(this);
}catch(Exception e){
}
alarmCursorAdapter = new AlarmCursorAdapter(this, mCorsur);
alarmCursorAdapter.notifyDataSetChanged();
alarm_list_view = (ListView)findViewById(R.id.alarm_list);
alarm_list_view.setAdapter(alarmCursorAdapter);
alarm_list_view.setOnItemClickListener(this);
alarm_list_view.setOnItemLongClickListener(alarmOnItemLongClickListener);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
init();
}
public Cursor getAlarmCursorList(Context context) {
SQLiteDatabase databse = null;
if(databse == null){
databse = openOrCreateDatabase(DatabaseHelper.DATABASE_NAME, SQLiteDatabase.CREATE_IF_NECESSARY, null);
}
String stringOrderBy = "ORDER BY "
+ DatabaseHelper.DATABASE_COLUMN_HOUR + " ASC, " + DatabaseHelper.DATABASE_COLUMN_MINUTES + " ASC"; // 시간과 분 값으로 오름차순
Cursor cursor = null;
try {
cursor = databse.rawQuery("SELECT "
+ DatabaseHelper.DATABASE_COLUMN_ID + ", "
+ DatabaseHelper.DATABASE_COLUMN_HOUR + ", "
+ DatabaseHelper.DATABASE_COLUMN_MINUTES + ", "
+ DatabaseHelper.DATABASE_COLUMN_DAYS_OF_WEEK + ", "
+ DatabaseHelper.DATABASE_COLUMN_ALARM_TIME + ", "
+ DatabaseHelper.DATABASE_COLUMN_ENABLED + ", "
+ DatabaseHelper.DATABASE_COLUMN_MESSAGE + ", "
+ DatabaseHelper.DATABASE_COLUMN_VIBRATE + ", "
+ DatabaseHelper.DATABASE_COLUMN_ALERT + ", "
+ DatabaseHelper.DATABASE_COLUMN_VOLUME + ", "
+ DatabaseHelper.DATABASE_COLUMN_SNOOZE + ", "
+ DatabaseHelper.DATABASE_COLUMN_VIBRATE_TYPE + " " + " FROM "
+ DatabaseHelper.DATABASE_TABLE_NAME + " " + stringOrderBy, null);
if (cursor != null && cursor.moveToFirst()) {
try{
list_count = cursor.getCount();
}catch (Exception e2) {
// TODO: handle exception
Log.e(TAG, "e2 "+e2);
}
}else{
list_count = 0;
}
}catch (Exception e) {
// TODO: handle exception
Log.e(TAG, "e "+e);
}
finally {
//if (cursor != null)
// cursor.close();
if(databse != null){
databse.close();
}
}
return cursor;
}
@Override
public void onItemClick(AdapterView parent, View view, int pos, long id) {
// TODO Auto-generated method stub
final Cursor cursor = (Cursor) alarm_list_view.getAdapter()
.getItem(pos);
Alarm alarm = new Alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8), cursor.getString(9), cursor.getString(10), cursor.getString(11));
Intent intent = new Intent(AlarmMain.this, SetAlarm.class);
intent.putExtra(ALARMID, alarm.getId());
intent.putExtra(MODE, UPDATEMODE);
startActivity(intent);
}
윗분들 말씀처럼 해보았지만
indicator.setOnClickListener 클릭시 db는 업데이트가되는데
ListView를 갱신시켜줘야되는데 안되네요
현재쓰고있는 코드를 올렸습니다. 어디부분을 수정해야될까요?
첨부된 사진에 아이콘 부분을 눌렀을때 db는 업데이트 되며, ListView가 갱신이 안됩니다.
수정해야 할 부분 캐취 부탁드립니다.
잘 읽어보진 않았지만 OnClick 후에 DB 업데이트 있은다음
alarmCursorAdapter.notifyDataSetChanged();
호출하면 갱신되지 않을까요?