주소록을 불러와 삭제 하는 기능 구현중 입니다.
package z.Contact;
import java.util.ArrayList;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class delete extends Activity {
ListView listPerson;
ArrayList<String> persons;
ArrayAdapter<String> adp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.delete);
listPerson = (ListView)findViewById(R.id.listPerson);
getList();
listPerson.setOnItemClickListener(mItemClickListener);
}
public void getList(){
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
};
String[] selectionArgs = null;
Cursor contactCursor = managedQuery(uri, projection, null, selectionArgs, null);
ArrayList<String> persons = new ArrayList<String>();
if(contactCursor.moveToFirst()){
do{
persons.add(contactCursor.getString(1)+ "/" +contactCursor.getString(0));
}while(contactCursor.moveToNext());
}
ArrayAdapter<String> adp = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, persons);
listPerson.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listPerson.setAdapter(adp);
}
public void mOnClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.delete:
Log.d("TAG","clicked");
SparseBooleanArray sb = listPerson.getCheckedItemPositions();
if(sb.size() !=0){
for(int i = listPerson.getCount() -1; i>=0; i--){
if(sb.get(i)){
persons.remove(i); // 문제 발생 부분
adp.notifyDataSetChanged();
}
}
listPerson.clearChoices()
}
break;
}
}
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): FATAL EXCEPTION: main
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): java.lang.IllegalStateException: Could not execute method of the activity
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.view.View$1.onClick(View.java:2154)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.view.View.performClick(View.java:2538)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.view.View$PerformClick.run(View.java:9152)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.os.Handler.handleCallback(Handler.java:587)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.os.Handler.dispatchMessage(Handler.java:92)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.os.Looper.loop(Looper.java:130)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.app.ActivityThread.main(ActivityThread.java:3687)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at java.lang.reflect.Method.invokeNative(Native Method)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at java.lang.reflect.Method.invoke(Method.java:507)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at dalvik.system.NativeStart.main(Native Method)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): Caused by: java.lang.reflect.InvocationTargetException
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at java.lang.reflect.Method.invokeNative(Native Method)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at java.lang.reflect.Method.invoke(Method.java:507)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at android.view.View$1.onClick(View.java:2149)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): ... 11 more
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): Caused by: java.lang.NullPointerException
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at z.Contact.delete.mOnClick(delete.java:76)
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): ... 14 more
08-31 09:39:58.941: ERROR/(148): Dumpstate > /data/log/dumpstate_app_error
08-31 09:39:58.941: ERROR/DropBoxManagerService(148): disable reading and writing to dropbox
persons.remove(i); 이부분에서 exception 발생하는것 같은데 초보라 파악을 잘 못하겠습니다.
도움좀 주십시요
public void getList(){
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
};
String[] selectionArgs = null;
Cursor contactCursor = managedQuery(uri, projection, null, selectionArgs, null);
persons = new ArrayList<String>(); <--- 멤버변수로 변경!
if(contactCursor.moveToFirst()){
do{
persons.add(contactCursor.getString(1)+ "/" +contactCursor.getString(0));
}while(contactCursor.moveToNext());
}
ArrayAdapter<String> adp = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, persons);
listPerson.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listPerson.setAdapter(adp);
}
persons이 지역변수 즉 getList메서드안에서만 존재하게 선언하셨네요.. 위에처럼 변경하면 될듯싶네요




원인은 persons 이게 Null 이랍니다.
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): Caused by: java.lang.NullPointerException
08-31 09:39:58.933: ERROR/AndroidRuntime(1418): at z.Contact.delete.mOnClick(delete.java:76)
persons 이거 지울때 sba 하고 listPerson 이 변수 크기는 줄어 들지 않을 듯 싶은데...
전체적으로 for문에 문제가 있는듯 싶어요.