안드로이드 개발 질문/답변
(글 수 45,052)
어뎁터를 통해 listview를 구현했습니다.
각 row 마다 버튼(btnBuy)이 있는데요
버튼을 클릭하면 alert dialog가 뜨면서 yes/no 선택하는 버튼이 나옵니다.
여기서 yes를 누르면 날짜 설정을 위해 datepickerdialog를 호출하는데요..
호출하는 메서드 내에 있는 dialog 생성 부분(빨간 부분)에서 예상치못한종료가 되네요ㅜ
Log에는 dialog 생성 부분에서 argument가 잘못되었다는데..
왜 종료가 되는지 모르겟습니다ㅜ
참고로 DialogDatePicker() 메소드는 다른 activity에서는 잘 돌아갓고요
그때는 argument로 context 대신 this를 썻었습니다.
고수님들 답변 부탁드립니다ㅜ
public class ShopItemAdapter extends BaseAdapter{
private List<Shopping> items;
private LayoutInflater layoutInflater;
private Context context;
private FoodManagerDataHelper openHelper;
private SQLiteDatabase sdb;
private int item_id;
private int item_position;
private String shopName;
private int mYear;
private int mMonth;
private int mDay;
public ShopItemAdapter (Context context, List<Shopping> items) {
layoutInflater = LayoutInflater.from(context);
this.items = items;
this.context = context;
}
class ViewHolder {
TextView name;
TextView cnt;
Button btnBuy;
ImageButton btnDel;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = layoutInflater.inflate(R.layout.shopping_list_row, null);
holder = new ViewHolder();
holder.name = (TextView)convertView.findViewById(R.id.shop_name);
holder.cnt = (TextView)convertView.findViewById(R.id.shop_cnt);
holder.btnBuy = (Button)convertView.findViewById(R.id.btn_buy);
holder.btnDel = (ImageButton)convertView.findViewById(R.id.btn_delShop);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
final Shopping item = items.get(position);
holder.name.setText(item.getName());
holder.cnt.setText(String.valueOf(item.getCnt()));
holder.btnBuy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
item_id = item.getID();
item_position = position;
shopName = item.getName();
DialogAdd();
}
});
holder.btnDel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
item_id = item.getID();
item_position = position;
DialogDelete();
}
});
return convertView;
}
private void DialogAdd(){
AlertDialog.Builder alt_bld = new AlertDialog.Builder(context);
alt_bld.setMessage("식품 목록에 추가 하시겠습니까?").setCancelable(
false).setPositiveButton("예",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for 'Yes' Button
dialog.cancel(); DialogDatePicker();
}
}).setNegativeButton("아니오",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for 'NO' Button
openHelper = new FoodManagerDataHelper(context);
sdb = openHelper.getWritableDatabase();
sdb.delete(FM.TABLE_NAME_SHOP, FM._ID+"="+item_id, null);
items.remove(item_position);
notifyDataSetChanged();
Toast.makeText(context, "물품을 구매했습니다", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
// Title for AlertDialog
alert.setTitle("확인");
// Icon for AlertDialog
alert.setIcon(R.drawable.ic_menu_info_details);
alert.show();
}
private void DialogDelete(){
AlertDialog.Builder alt_bld = new AlertDialog.Builder(context);
alt_bld.setMessage("삭제 하시겠습니까?").setCancelable(
false).setPositiveButton("예",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for 'Yes' Button
openHelper = new FoodManagerDataHelper(context);
sdb = openHelper.getWritableDatabase();
sdb.delete(FM.TABLE_NAME_SHOP, FM._ID+"="+item_id, null);
items.remove(item_position);
Toast.makeText(context, "항목이 삭제되었습니다", Toast.LENGTH_SHORT).show();
notifyDataSetChanged();
}
}).setNegativeButton("아니오",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for 'NO' Button
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
// Title for AlertDialog
alert.setTitle("확인");
// Icon for AlertDialog
alert.setIcon(R.drawable.ic_menu_info_details);
alert.show();
}
private void DialogDatePicker(){
Toast.makeText(context, "유통기한을 선택하세요", Toast.LENGTH_SHORT).show();
DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
// onDateSet method
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
openHelper = new FoodManagerDataHelper(context);
sdb = openHelper.getWritableDatabase();
ContentValues food_values = new ContentValues();
food_values.put(FM.FOOD_NAME, shopName);
food_values.put(FM.FOOD_YEAR, mYear);
food_values.put(FM.FOOD_MONTH, mMonth);
food_values.put(FM.FOOD_DAY, mDay);
sdb.insert(FM.TABLE_NAME_FOOD, null, food_values);
sdb.close();
Toast.makeText(context, "구매 물품이 식품 목록에 추가되었습니다", Toast.LENGTH_SHORT).show();
}
};
DatePickerDialog alert = new DatePickerDialog(context, mDateSetListener, mYear, mMonth, mDay);
Log.e("res", "here");
alert.show();
}
}




showDialog쓰고 Activity에서 protected 멤버인 onCreateDialog(int dialogId)를 구현해보세요