소근소근

안드로이드 스튜디오 연락처 연동 - 삭제하기 / RecyclerView에서 아이템 스와이프시 삭제하기[AndroidStudio-JAVA] 본문

AndroidStudio

안드로이드 스튜디오 연락처 연동 - 삭제하기 / RecyclerView에서 아이템 스와이프시 삭제하기[AndroidStudio-JAVA]

JJureng 2021. 7. 5. 20:57
728x90
반응형
SMALL

지난번 업로드에서 다룬 '리사이클러뷰에서 스와이프로 아이템 위치 변경 및 삭제'에 코드를 추가하여,

스와이프시 연락처가 리사이클러뷰 에서도 지워지고, 실제 연락처에서 삭제되도록 구현하였다.

 

링크

[AndroidStudio] - 리사이클러뷰(RecyclerView) 스와이프(swipe)로 아이템 이동 및 삭제 구현[AndroidStudio-JAVA]

 

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

AndroidManifest.xml파일에서 먼저 권한 허용을 해준다.

 

리사이클러뷰에 번호들을 보여주는 구조라서, 리사이클러 어댑터 클래스에서 삭제 기능을 구현한다.

public class PhoneAdapter extends RecyclerView.Adapter<PhoneAdapter.MyViewHolder> implements ItemTouchHelperListener {

    ContentResolver cr;

    public PhoneAdapter(ArrayList<String> numbook , ArrayList<String> namebook , ArrayList<Bitmap> photobook){

    }

    @Override
    public boolean onItemMove(int from_position, int to_position) {

    }

    @Override
    public void onItemSwipe(int position) {
        String number = numbook.get(position);

        long ID = getContactIDFromNumber(cr,number);
        String where = ContactsContract.RawContacts.CONTACT_ID + "=" + String.valueOf(ID);
        cr.delete(ContactsContract.RawContacts.CONTENT_URI , where, null);

        namebook.remove(position);
        numbook.remove(position);
        photobook.remove(position);

        notifyItemRemoved(position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
    	private TextView phonenum;
        private TextView name;
        private ImageButton call;
        private ImageView photo;

        public MyViewHolder(final View view){
            super(view);
            phonenum = view.findViewById(R.id.tv_phone);
            name = view.findViewById(R.id.tv_name);
            call = view.findViewById(R.id.ib_call);
            photo = view.findViewById(R.id.iv_photo);

            cr = view.getContext().getContentResolver();

           
        }
    }

    @NonNull
    @Override
    public PhoneAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    }

    @Override
    public void onBindViewHolder(@NonNull PhoneAdapter.MyViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {
    }

    public static long getContactIDFromNumber(ContentResolver contacthelper , String number){
        long rawContactId = -1;
        Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI , Uri.encode(number));
        String [] projection = {ContactsContract.PhoneLookup._ID};
        Cursor cursor = null;

        try{
            cursor = contacthelper.query(contactUri,projection,null,null,null);
            if(cursor.moveToFirst()){
                rawContactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(cursor!=null){
                cursor.close();
            }
        }
        return rawContactId;
    }
}

getContactIDFromNumber함수로 , 전화번호로 contact id를 구해 리턴한다.

onItemSwipe에서 리턴받은 contact id를 가지고 contentresolver의 delete로 해당 번호를 삭제한다.

 

이때, 어댑터에서 getContentResolver함수를 쓰기 위해서는 view.getContext().getContentResolver() 로 접근이 가능하므로, 뷰 홀더 클래스에서 해줘야 한다.

728x90
반응형
LIST