0. Result
1. Remove Data
1-1. Create removeGuest method that removes a record from DB.
1-2. Create a new ItemTouchHelper that handles swiping guests off the list.
1-3. Set the tag of the RecyclerView item to the DB id of that guest.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | package com.tistory.qlyh8.sqlite; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.util.Log; import android.view.View; import android.widget.EditText; import com.tistory.qlyh8.sqlite.data.TestUtil; import com.tistory.qlyh8.sqlite.data.WaitlistContract; import com.tistory.qlyh8.sqlite.data.WaitlistDbHelper; public class MainActivity extends AppCompatActivity { private GuestListAdapter mAdapter; RecyclerView waitlistRecyclerView; // SQL DB의 레퍼런스 private SQLiteDatabase mDb; private EditText mNewGuestNameEditText; private EditText mNewPartySizeEditText; private final static String LOG_TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); waitlistRecyclerView = this.findViewById(R.id.all_guests_list_view); mNewGuestNameEditText = this.findViewById(R.id.person_name_edit_text); mNewPartySizeEditText = this.findViewById(R.id.party_count_edit_text); // 리사이클러뷰를 리니어 레이아웃으로 설정 waitlistRecyclerView.setLayoutManager(new LinearLayoutManager(this)); WaitlistDbHelper dbHelper = new WaitlistDbHelper(this); // 데이터를 DB에 채우기 위함 mDb = dbHelper.getWritableDatabase(); //커서에 결과를 저장 Cursor cursor = getAllGuests(); // 데이터를 표시할 커서를 위한 어댑터 생성 mAdapter = new GuestListAdapter(this, cursor); // 리사이클러뷰에 어댑터를 연결 waitlistRecyclerView.setAdapter(mAdapter); // 목록에서 항목을 왼쪽, 오른쪽 방향으로 스와이프 하는 항목을 처리 new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { // 사용하지 않는다. @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 스와이프된 아이템의 아이디를 가져온다. long id = (long) viewHolder.itemView.getTag(); // DB 에서 해당 아이디를 가진 레코드를 삭제한다. removeGuest(id); // 리스트를 갱신한다. mAdapter.swapCursor(getAllGuests()); } }).attachToRecyclerView(waitlistRecyclerView); //리사이클러뷰에 itemTouchHelper 를 붙인다. } // 등록하기 버튼을 눌렀을 때 불리는 메서드 public void addToWaitlist(View view) {...} /* * Cursor 는 SQL 쿼리의 결과물이 저장되어 있는 것이다. * 반복문으로 쉽게 확인할 수 있다. * */ // 손님의 목록을 보여주기 위해 시간 순서대로 결과를 보여준다. private Cursor getAllGuests() {...} // 새 데이터를 추가하는 메서드로, 추가되는 레코드의 아이디를 리턴한다. private long addNewGuest(String name, int partySize) {...} // 특정 아이디를 가진 레코드를 삭제 private boolean removeGuest(long id) { // 성공적인 삭제이면 true 를 리턴하고, 실패하면 false 를 리턴한다. return mDb.delete(WaitlistContract.WaitlistEntry.TABLE_NAME, WaitlistContract.WaitlistEntry._ID + "=" + id, null) > 0; } } | cs |
GuestListAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package com.tistory.qlyh8.sqlite; /* * Created by YUNHEE on 2018-01-06. */ import android.content.Context; import android.database.Cursor; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.tistory.qlyh8.sqlite.data.WaitlistContract; public class GuestListAdapter extends RecyclerView.Adapter<GuestListAdapter.GuestViewHolder>{ private Context mContext; private Cursor mCursor; public GuestListAdapter(Context context, Cursor cursor) {...} @Override public GuestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {...} // 포지션을 입력 받아서 해당 데이터를 UI에 출력 @Override public void onBindViewHolder(GuestViewHolder holder, int position) { // 해당 포지션으로 이동한다. // false 가 리턴되면 데이터가 없거나 혹은 범위를 초과했다는 뜻이다. if(!mCursor.moveToPosition(position)) return; // 열의 이름으로 열의 번호를 넘겨줌 String name = mCursor.getString(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_GUEST_NAME)); int partySize = mCursor.getInt(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_PARTY_SIZE)); // 현재 커서에서 아이디를 가져온다. long id = mCursor.getLong(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry._ID)); holder.nameTextView.setText(name); holder.partySizeTextView.setText(String.valueOf(partySize)); // 홀더에 있는 아이템뷰의 태그를 id로 설정 holder.itemView.setTag(id); } @Override public int getItemCount() {...} // 어댑터에 현재 보관되고 있는 커서를 새로운 것으로 바꿔 UI를 갱신한다. public void swapCursor(Cursor newCursor) {...} // 리사이클러뷰 내에서 단일의 아이템을 표시하는데 필요한 뷰를 보관 및 유지하는 내부 클래스 class GuestViewHolder extends RecyclerView.ViewHolder {...} } | cs |
Android Course of Udacity - Lesson 7
'Android' 카테고리의 다른 글
Content Provider - (2) 사용방법 (0) | 2018.01.08 |
---|---|
Content Provider - (1) 개념 (0) | 2018.01.08 |
SQLite - (2) 데이터 업데이트 및 추가하기 (0) | 2018.01.06 |
SQLite - (1) DB 생성 및 데이터 가져오기 (0) | 2018.01.06 |
Preferences - (6) EditText Preference (0) | 2018.01.04 |