올리신 소소코드를 기반으로 동작하는 샘플코드를 만들어 봤습니다. 일부 클래스명, 변수명 등은 자바의 규칙에 맞는 좀 더 명료한 이름으로 변경했습니다.
import java.io.Serializable;
// Intent로 커스텀 오브젝트를 전달하려면 Serializable 또는 Parcelable을 구현해야 합니다.
public class EventItem implements Serializable {
private final long id;
private final String title;
private final String date;
public EventItem(long id, String title, String date) {
this.id = id;
this.title = title;
this.date = date;
}
public long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getDate() {
return date;
}
}
public class EventAdapter extends BaseAdapter {
private static class ViewHolder {
TextView titleTv;
TextView dateTv;
}
interface Listener {
// 개별 필드를 전달할 필요없이 모든 필드가 들어있는 Serialzable 오브젝트를 하나 넘김.
void onEdit(EventItem item);
}
private List<EventItem> items = new ArrayList<>();
private Listener listener;
public EventAdapter(List<EventItem> items) {
this.items = items;
}
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
public int getCount() {
return items.size();
}
@Override
public EventItem getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return items.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = createHolderView(parent);
}
final EventItem item = items.get(position);
bindViewHolder(convertView, item);
ImageButton editBtn = convertView.findViewById(R.id.editBtn);
editBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) listener.onEdit(item);
}
});
return convertView;
}
private void bindViewHolder(View convertView, EventItem item) {
final ViewHolder holder = (ViewHolder) convertView.getTag();
holder.titleTv.setText(item.getTitle());
holder.dateTv.setText(item.getDate());
}
private View createHolderView(ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.item_cell, parent, false);
ViewHolder holder = new ViewHolder();
holder.titleTv = itemView.findViewById(R.id.titleTv);
holder.dateTv = itemView.findViewById(R.id.dateTv);
itemView.setTag(holder);
return itemView;
}
}
public class EventActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
setupViews();
}
private void setupViews() {
ListView eventListView = findViewById(R.id.eventList);
EventAdapter eventAdapter = new EventAdapter(getEvents());
eventAdapter.setListener(new EventAdapter.Listener() {
@Override
public void onEdit(EventItem item) {
EventEditActivity.show(EventActivity.this, item);
}
});
eventListView.setAdapter(eventAdapter);
};
// 테스트용 데이터이므로, 님의 코드를 사용하세요.
private List<EventItem> getEvents() {
return Arrays.asList(
new EventItem(1, "Event1", "2022-06-01"),
new EventItem(2, "Event2", "2022-06-02"),
new EventItem(3, "Event3", "2022-06-03")
);
}
}