마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리사이클러뷰 아이템 데이터 삭제

0 추천

버튼 클릭시에 해당 리사이클러뷰에 아이템을 삭제하도록 만듦과 동시에 db에 저장된 

아이템도 삭제하는 기능을 만들고 있습니다 (즉, 앱을 다시 껐다 켰을때 남아있지 않고 사라지게)

리사이클러뷰 아이템 마다 삭제버튼이 달려있습니다 (( 정보 +삭제 버튼 )<-이게 한 아이템 )

 

이것은 database중 일부인 아이템을 삭제하는 코드입니다

조건문을 내가 누른 삭제 버튼에 해당하는 아이템만 삭제하도록 하는 조건문은 어떻게 작성해야하나요??

public void deleteItem(String year, String month, String age, String grade, String score ) {
    try {
        1) db.execSQL( "delete from " + TABLE_TEST_INFO + " where 그 다음 어떻게..?" );
        2 )db.execSQL( "delete from " + TABLE_TEST_INFO + "(YEAR, MONTH, AGE, GRADE, SCORE) values ('" + year + "', '" + month + "', '" + age + "', '" + grade + "', '" + score + "');" );
    } catch(Exception ex) {
    }
}

 

이것은 어뎁터입니다

deletebutton을 눌렀을때 리사이클러뷰 아이템을 사라지게 하고 동시에 callback.select(~)를 통해 데이터베이스에서도 제거하도록 하고싶습니다

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder>{
    ArrayList<TestInfo> testInfos = new ArrayList<TestInfo>();

    OnDatabaseCallback callback;



    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.test_item, viewGroup, false);


        return new ViewHolder(itemView);

    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
        TestInfo testInfo = testInfos.get(position);
        viewHolder.setItem(testInfo);

        viewHolder.deletebutton.setTag(position);
        viewHolder.deletebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int itemposition = (int)v.getTag();
                testInfos.remove(itemposition);
                notifyDataSetChanged();

                callback.delete(~);
            }
        });

    }

    @Override
    public int getItemCount() {
        return testInfos.size();
    }

 

쿠롱 (400 포인트) 님이 2022년 1월 20일 질문

1개의 답변

0 추천

먼저 염두에 두실 것은 모든 것은 데이터를 변경해서 이것을 화면에 반영하는 형태로 처리를 하셔야 합니다.

즉, 화면에서 삭제 이벤트가 일어날 때, DB에서 해당 데이터를 먼저 지우고, DB를 다시 조회해서 나온 결과를 화면에 다시 보여주시면 됩니다.

먼저, TestInfo 클래스에 DB에서 사용하는 primary key값이 있는지 확인하세요. 없다면 같은 타입으로 추가하세요. 그리고 데이터를 가져올 때도 값을 할당해 주셔야 겠죠.

public class TestInfo {
   private final String id;
   ...
}

 

Adapter와 뷰홀더에서는 사용자의 삭제이벤트를 받을 수 있는 Listener를 하나 둡니다.  

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder>{
    ArrayList<TestInfo> testInfos = new ArrayList<TestInfo>();

     interface Listener {
           onDeleteItemClicked(TestInfo);
     }

     private Listener mListener;
     
     public void setListener(Listener listener) {
           mListener = listener;
     }
    ...

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
        TestInfo testInfo = testInfos.get(position);
        viewHolder.setItem(testInfo);
        viewHolder.setListener(mListener);
    }
 
 
   class ViewHolder... {
          
            private TestAdapter.Listener mListener;
            public void setListener(TestAdapter.Listener listener) {
                 mListener = listener;
            }
    
            public void setItem(TestInfo testInfo) {
                  ...

                  // deletebutton.setOnClickListener(new View.OnClickLisetner...)와 동일한 lambda.
                  deletebutton.setOnClickListener(v -> mListener.onDeleteItemClicked(testInfo));
            }
   }
}

 

액티비티에서 어댑터에 리스너를 연결해서, 사용자가 삭제버튼을 눌렀다는 것을 알 수 있게 합니다. 이벤트를 받으면 데이터 베이스에서 해당 아이템을 키값을 비교하여 삭제하고, 다시 DB를 조회한 다음, 결과값을 어댑터로 넘깁니다.

public void onCreate(Bundle saveInstance) {
     super.onCreate(..);
     ...

      setupRecylerView();
}

private TestInfoAdapter testInfoAdapter;
private void setupRecylerView() {
      testInfoAdapter =  new TestInfoAdapter();
      testInfoAdapter.setListener( testInfo -> deleteItemClicked(testInfo) );
      recyclerView.setAdapter(testInfoAdapter);
} 


public void deleteItemClicked(TestInfo item) {
      try {
           deleteItem(item);
           fetchItems();
       } catch(Exception e) {
          //에러처리
      }
}

private static final DELETE_BY_ID = "DELETE FROM %s WHERE id = '%s' ";
public void deleteItem(TestInfo testInfo) {
     String sql = String.format(DELETE_BY_ID, TABLE_TEST_INFO, testInfo.id);
     db.execSQL(sql);
}

public void fetchItems() {
    List<TestInfo> items =  getItems();
    testInfoAdapter.submitList(items);
}

도움이 되시길 바래요.

spark (227,530 포인트) 님이 2022년 1월 20일 답변
spark님이 2022년 1월 20일 수정
...