안드로이드 개발 질문/답변
(글 수 45,052)
현재 custom listview checkbox를 구현중에 있는데요.
checkbox누를때 와 item 클릭시 이벤트를 따로 구현하고 싶습니다.
즉 , 구현하고 싶은 바는
1. item을 클릭시에는 intent로 다음 화면으로 넘어감.(onitemclickListener로 잘 됨.)
2. checkbox를 이용해서 listitem을 삭제하기 위함.
현재,안되는 부분이 checkbox를 눌러서 선택후 삭제를 누르면 삭제가 안됩니다.
처음 해보는거라 팁이 많이 부족합니다. 고수님들의 조언 부탁드립니다.
소스는 올립니다.
-----main 소스 ---
public class WorkAndDispatchManage extends Activity implements OnClickListener, OnCheckedChangeListener{
Context mContext;
ImageButton mBackbtn;
Button mRegistrationbtn;
Button mDeletebtn;
ListView mListview;
CheckBox mCheckbox;
ArrayList<WorkAndDispatchListItem> mList = null;
WorkAndDispatchListAdapter mAdapter= null;
private static final int DELETEDIG = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.manage_word_and_dispatch_place);
mContext = this;
findViewByID();
setOnClick();
setList();
SetItemClick();
}
private void findViewByID()
{
mBackbtn = (ImageButton)findViewById(R.id.btn_back);
mRegistrationbtn=(Button)findViewById(R.id.btn_company);
mDeletebtn=(Button)findViewById(R.id.btn_delete);
mListview = (ListView)findViewById(R.id.listView);
mCheckbox = (CheckBox)findViewById(R.id.check);
}
private void setOnClick()
{
mBackbtn.setOnClickListener(this);
mRegistrationbtn.setOnClickListener(this);
mDeletebtn.setOnClickListener(this);
}
private void setList()
{
mList = new ArrayList<WorkAndDispatchListItem>();
mList = getDataSource();
//mListview.setItemsCanFocus(false);
mListview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mAdapter = new WorkAndDispatchListAdapter(mContext, R.layout.workanddispatchmanage_listview, mList);
mListview.setAdapter(mAdapter);
}
private void SetItemClick()
{
mListview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(mContext, WorkAndDispatchRegistration.class);
startActivity(intent);
}
});
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.btn_back:
finish();
break;
case R.id.btn_company:
Intent intent = new Intent();
intent.setClass(mContext, WorkAndDispatchRegistration.class);
startActivity(intent);
break;
case R.id.btn_delete:
showDialog(DELETEDIG);
break;
}
}
@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
makeDeleteDIG();
return super.onCreateDialog(id);
}
private void makeDeleteDIG()
{
AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setTitle(getString(R.string.notice));
ab.setMessage("정말로 삭제 하시겠습니까");
ab.setPositiveButton(getString(R.string.confirm),new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
delete();
}
});
ab.setNegativeButton(getString(R.string.closebtn), null);
ab.show();
}
//삭제하기 위함.
private void delete()
{
for(int i=0; i< mList.size(); i++)
{
SparseBooleanArray check = mListview.getCheckedItemPositions();
if(check.get(check.keyAt(i)))
{
mList.remove(i);
}
}
mListview.clearChoices();
mAdapter.notifyDataSetChanged();
}
// long[] checkedItems = mListview.getCheckItemIds();
// if (checkedItems == null || checkedItems.length == 0)
// {
// //ShowMessageBox(this, "Selected items is Nothing.");
// return;
// }
// //삭제
// for (int index = checkedItems.length - 1; index >= 0; index--)
// {
// long pos = checkedItems[index];
// mList.remove((int) pos);
// }
// mListview.clearChoices();
// ((WorkAndDispatchListAdapter) mAdapter).notifyDataSetChanged();
// }
private static ArrayList<WorkAndDispatchListItem> getDataSource() {
ArrayList<WorkAndDispatchListItem> Items = new ArrayList<WorkAndDispatchListItem>();
for (int i = 0; i < 20; i++) {
WorkAndDispatchListItem item = new WorkAndDispatchListItem("본사 서초동" + i);
Items.add(item);
}
return Items;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
}
}
-------------------------------------------------------------------------------------------------------------
그리고 아래 부분은 adapter쪽 소스 입니다.
public class WorkAndDispatchListAdapter extends ArrayAdapter<WorkAndDispatchListItem>{
Context mContext;
ArrayList<WorkAndDispatchListItem> mItem;
ViewHolder holder;
public Hashtable<Integer, View> hashConvertView = new Hashtable<Integer, View>();
public WorkAndDispatchListAdapter(Context mContext, int layout,
ArrayList<WorkAndDispatchListItem> List) {
super(mContext, layout, List);
this.mItem = List;
this.mContext = mContext;
}
@Override
public View getView(int position, View convertView,ViewGroup parent){
// TODO Auto-generated method stub
WorkAndDispatchListItem item = mItem.get(position);
final int p = position;
// ViewHolder holder;
if (hashConvertView.containsKey(position) == false) {
// convertView = (com.logicplant.uFlow.CheckableRelativeLayout)LayoutInflater.from(mContext).inflate(
// R.layout.workanddispatchmanage_listview, parent, false);
convertView = (RelativeLayout)LayoutInflater.from(mContext).inflate(
R.layout.workanddispatchmanage_listview, parent, false);
holder = new ViewHolder();
holder.mNameTxt = (TextView)convertView.findViewById(R.id.title);
holder.mCheckbox = (CheckBox)convertView.findViewById(R.id.check);
convertView.setTag(holder);
hashConvertView.put(position, convertView);
} else {
convertView = (View) hashConvertView.get(position);
holder = (ViewHolder) convertView.getTag();
}
holder.mNameTxt.setText(item.mPlaceOfPlace);
return convertView;
}
static class ViewHolder
{
TextView mNameTxt;
CheckBox mCheckbox;
}
}
DELETE를 하기위해서 checkbox를 선택했을때의 position값을 어떻게 셋팅하면 되나요?
이틀쨰 삽질중에 있습니다. 고수님의 조언 부탁드리겠습니다.