질문에 많은 정보가 빠져 있었네요.
체크박스 누를 때 DB에 저장을 하고 나면, 다시 서버에서 업데이트 된 정보를 가져와서 리스트뷰를 갱신해 주세요. 올리신 코드에 어댑터을 호출하는 부분이 없어서 임의대로 추측해서 코드를 적어 보겠습니다. 일부 클래스이름, 멤버변수 등은 가독성에 도움이 되는 방향으로 변경하였습니다.
public class PublicDataAdapter extends BaseAdapter {
private static class ViewHolder {
TextView titleTxt;
TextView contentTxt;
CheckBox favouriteCheck;
}
// 외부와의 interaction을 위해 Interface를 사용.
interface Listener {
void onAddFavourite(PublicDataItem item);
}
private final List<PublicDataItem> items = new ArrayList<>();
private Listener listener;
public void submitList(List<PublicDataItem> items) {
this.items.clear();
this.items.addAll(items);
notifyDataSetChanged();
}
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
public int getCount() {
return items.size();
}
@Override
public PublicDataItem getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return items.get(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = createHolderView(parent);
}
final PublicDataItem item = items.get(position);
bindViewHolder(convertView, item);
return convertView;
}
private void bindViewHolder(View convertView, PublicDataItem item) {
final ViewHolder holder = (ViewHolder) convertView.getTag();
holder.titleTxt.setText(item.getServNm());
holder.contentTxt.setText(item.getServDgst());
holder.favouriteCheck.setChecked(item.isChecked());
holder.favouriteCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Listener가 설정되었을 경우 Listener에 있는 메소드 호출.
if (listener != null) listener.onAddFavourite(item);
}
});
}
private View createHolderView(ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.item_public_data, parent, false);
ViewHolder holder = new ViewHolder();
holder.titleTxt = itemView.findViewById(R.id.titleTxt);
holder.contentTxt = itemView.findViewById(R.id.contentTxt);
holder.favouriteCheck = itemView.findViewById(R.id.favouriteCheck);
itemView.setTag(holder);
return itemView;
}
}
핵심이 되는 어댑터의 코드입니다. 어댑터에서 발생하는 CheckBox 클릭 이벤트의 실제적인 처리는 어댑터가 할 일이 아니라 CheckBox를 누른 쪽의 역할입니다. 이 때문에 Listener 라는 인터페이스를 하나 선언하고 어댑터를 사용하는 쪽이 Listener인터페이스를 구현하도록 합니다. 이렇게 해야 어댑터도 재사용이 용이하고 호출하는 쪽에 이벤트 처리를 위임하므로 종속적이지 않는 코드가 됩니다.
public class PublicDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
setupViews();
}
private final PublicDataAdapter publicDataAdapter = new PublicDataAdapter();
private void setupViews() {
ListView eventListView = findViewById(R.id.eventList);
publicDataAdapter.submitList(getPublicDataItems());
publicDataAdapter.setListener(new PublicDataAdapter.Listener() {
@Override
public void onAddFavourite(PublicDataItem item) {
addFavourite(item);
}
});
eventListView.setAdapter(publicDataAdapter);
}
private void addFavourite(PublicDataItem item) {
// 이 코드는 데모 목적이므로, 실제로는 서버에 데이터를 저장하는 코드를 사용하셔야 겠죠?
for (PublicDataItem element : demoData) {
if (item.getServID().equals(element.getServID())) {
element.setChecked(!element.isChecked());
break;
}
}
// 저장후 데이터를 다시 불러와 리스트뷰를 갱신
publicDataAdapter.submitList(getPublicDataItems());
}
private final List<PublicDataItem> demoData = Arrays.asList(
new PublicDataItem("1", "Title1", "Content1", false),
new PublicDataItem("2", "Title2", "Content2", true),
new PublicDataItem("3", "Title3", "Content3", false)
);
private List<PublicDataItem> getPublicDataItems() {
// 데모 목적의 코드이므로, 실제로는 서버에서 데이터를 가져오는 코드를 사용할 것.
return demoData;
}
}
액티비티의 코드입니다. setupView에서 PublicDateAdapter.setListener를 호출하고 있습니다. addFavourite 메소드에서 데이터를 저장하는 부분이 asynchronous(비동기) 방식이면, 저장 작업이 끝난 후에 어댑터를 갱신하는 코드를 호출하셔야 겠죠.