안드로이드 개발 질문/답변
(글 수 45,052)
public class ListAddDel extends Activity{
ArrayList<String> items;
ArrayAdapter<String> adapter;
ListView list;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widget_listadddel);
items = new ArrayList<String>();
items.add("First");
items.add("Second");
items.add("Third");
adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_multiple_choice, items
);
list = (ListView)findViewById(R.id.list);
list.setAdapter(adapter);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
list.setOnItemClickListener(itemClick);
findViewById(R.id.add).setOnClickListener(click);
findViewById(R.id.delete).setOnClickListener(click);
}
View.OnClickListener click = new View.OnClickListener(){
public void onClick(View v) {
EditText ed = (EditText)findViewById(R.id.newitem);
switch (v.getId()) {
case R.id.add:
String txt = ed.getText().toString();
if(txt.length()!=0){
items.add(txt);
ed.setText("");
adapter.notifyDataSetChanged();
}
break;
case R.id.delete:
for(int i=0; i < items.size(); i++){
SparseBooleanArray check = list.getCheckedItemPositions();
System.out.println("check.get(i)"+check.get(i));
if(check.get(check.keyAt(i))){
items.remove(i);
}
}
adapter.notifyDataSetChanged();
list.clearChoices();
break;
}
};
};
AdapterView.OnItemClickListener itemClick = new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
String mes;
mes = "Select Item = " + items.get(arg2);
System.out.println(mes);
}
};
}
ArrayList<String> items;
ArrayAdapter<String> adapter;
ListView list;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widget_listadddel);
items = new ArrayList<String>();
items.add("First");
items.add("Second");
items.add("Third");
adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_multiple_choice, items
);
list = (ListView)findViewById(R.id.list);
list.setAdapter(adapter);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
list.setOnItemClickListener(itemClick);
findViewById(R.id.add).setOnClickListener(click);
findViewById(R.id.delete).setOnClickListener(click);
}
View.OnClickListener click = new View.OnClickListener(){
public void onClick(View v) {
EditText ed = (EditText)findViewById(R.id.newitem);
switch (v.getId()) {
case R.id.add:
String txt = ed.getText().toString();
if(txt.length()!=0){
items.add(txt);
ed.setText("");
adapter.notifyDataSetChanged();
}
break;
case R.id.delete:
for(int i=0; i < items.size(); i++){
SparseBooleanArray check = list.getCheckedItemPositions();
System.out.println("check.get(i)"+check.get(i));
if(check.get(check.keyAt(i))){
items.remove(i);
}
}
adapter.notifyDataSetChanged();
list.clearChoices();
break;
}
};
};
AdapterView.OnItemClickListener itemClick = new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
String mes;
mes = "Select Item = " + items.get(arg2);
System.out.println(mes);
}
};
}
2010.08.16 22:44:04
check.get(i) : SparseBooleanArray에서 i번째 값(Value)를 가져옴....
check.get(check.keyAt(i)) : SparseBooleanArray에서 i번째 Key에 대응되는 값을 가져옴....
터치한 아이템의 인덱스가 key가 되고 그값이 true이면 checked가 true인 것입니다.
따라서 처음부터 순서대로 터치하면 잘 모르게 되는데요.....
막 클릭해서 보면 밑에것이 맞다는걸 알게됩니다.
check.get(check.keyAt(i)) : SparseBooleanArray에서 i번째 Key에 대응되는 값을 가져옴....
터치한 아이템의 인덱스가 key가 되고 그값이 true이면 checked가 true인 것입니다.
따라서 처음부터 순서대로 터치하면 잘 모르게 되는데요.....
막 클릭해서 보면 밑에것이 맞다는걸 알게됩니다.
2010.08.16 23:01:22
말씀하신대로 해봤는데요 하나체크했는데 2개삭제될때도 있고 원하는목록삭제시 다른놈이 삭제되고
체크시 에러도 발생하네요.. 누가 버그라고 올린걸본적이있는거 같은데 이거 어떻게 해야해야할지요 ;;
체크시 에러도 발생하네요.. 누가 버그라고 올린걸본적이있는거 같은데 이거 어떻게 해야해야할지요 ;;
2010.08.16 23:04:32
저도 프로젝트에서 구현해서 쓰고 있는 부분이라 제대로 짜면 버그 없구요....
가만 보아하니...
SparseBooleanArray check = list.getCheckedItemPositions();
이걸 루프 밖으로 빼세요.... 이게 안에있으면 안되죠....
2010.08.16 23:10:45
말씀하신대로 밖으로 뺐더니 체크를 한개만 했을시는 원하는값이 삭제가 잘되는데요 두개이상 체크해서 삭제하면
원하는 결과를 얻을수가 없네요 ;; 혹시 이부분에 대해서 샘플소스조언좀 얻을수없을까요 ;;
원하는 결과를 얻을수가 없네요 ;; 혹시 이부분에 대해서 샘플소스조언좀 얻을수없을까요 ;;
2010.08.16 23:34:54
흠... 차이가 뭔지 대충 알겠네요... 저는 저 문장을 SimpleCursorAdapter에서 썼고....
지우는 문장에서 인덱스 기반이 아닌 DB의 Key를 얻어서 지웠습니다.
제꺼는 하나 날린다고 해서 Key가 바뀌지 않으니 루프 하나로 지울수 있었죠.
저 소스의 경우 하나 지우면 인덱스가 다시 쓰여지니까 이후에 잘못된 인덱스가 자꾸 접근이 됐던거네요...
SparseBooleanArray check = list.getCheckedItemPositions();
int i=0;
while(check.size()>0 && i<check.size()){
if(check.get(check.keyAt(i))){
items.remove(check.keyAt(i));
check = list.getCheckedItemPositions();
i=0;
}else{
i++;
}
}
대충 이렇게 루프 잡으면 될거 같은데요... 확실히 안해봐서 잘 모르겠네요.