我想提出一个更简单的解决方案:由于单击处理程序接收视图作为参数,因此回收器适配器和选择器对话框之间的所有必要通信都可以通过视图上的标签来实现。在此处查看允许设置日期和时间的对话框序列:
RecyclerAdapter(假设数组列表encounters为数据模型):
@Override
public void onBindViewHolder(
EncounterViewHolder holder, int position) {
final Encounter encounter = encounters.get(position);
holder.getDate().setText(encounter.getDate());
holder.getDate().setTag(R.string.tag_adapter, this);
holder.getDate().setTag(R.string.tag_position, new Integer(position));
holder.getDate().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
showDatePickerDialog(view);
return true;
}
});
}
public void showDatePickerDialog(View view) {
DatePickerFragment datePickerFragment = new DatePickerFragment(view);
datePickerFragment.show(((FragmentActivity) context).getSupportFragmentManager(), "datePicker");
}
public void showTimePickerDialog(View view) {
TimePickerFragment timePickerFragment = new TimePickerFragment(view);
timePickerFragment.show(((FragmentActivity) context).getSupportFragmentManager(), "timePicker");
}
void notifyDateTimeChanged(int position, Calendar calendar) {
encounters.get(position).setDate(new Timestamp().get(calendar));
notifyDataSetChanged();
}
日期选择器片段:
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
private View view;
DatePickerFragment(View view) {
this.view = view;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar calendar = new GregorianCalendar();
calendar.set(year, month, day);
(this.view).setTag(R.string.tag_calendar, calendar);
EncounterRecyclerAdapter adapter = (EncounterRecyclerAdapter) (this.view).getTag(R.string.tag_adapter);
adapter.showTimePickerDialog(this.view);
}
}
时间选择器片段:
public class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
private View view;
TimePickerFragment(View view)
{
this.view = view;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
EncounterRecyclerAdapter adapter = (EncounterRecyclerAdapter) (this.view).getTag(R.string.tag_adapter);
int position = ((Integer) (this.view).getTag(R.string.tag_position));
GregorianCalendar calendar = ((GregorianCalendar) (this.view).getTag(R.string.tag_calendar));
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), hour, minute);
adapter.notifyDateTimeChanged(position, calendar);
}
}