您可以創建適配器進行通信的接口:
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
public TextView dateTextView;
private IAdapter adapter;
public RecyclerViewHolder(View itemView, IAdapter adapter) {
super(itemView);
dateTextView = (TextView) itemView.findViewById(R.id.date_textview);
this.adapter = adapter;
dateTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialogFragment fragment = MyDialogFragment.newInstance(getAdapterPosition(), adapter);
FragmentTransaction ft = v.getContext().getFragmentManager().beginTransaction();
fragment.show(ft, "calendarDialog");
}
});
}
}
該適配器將需要實現的接口:
interface IAdapter extends Serializable {
void setDataAt(int index, Calendar date);
void notifyItemChanged(int index);
}
由於適配器已經有notifyItemChanged
方法,你只會需要實施setDataAt
方法。
假設你的適配器將只包含日期,這裏有一個例子:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> implements IAdapter {
private List<Calendar> dates = new ArrayList<>();
public RecyclerViewAdapter(List<Calendar> dates) {
this.dates = dates;
}
@Override
public void setDataAt(int index, Calendar date) {
dates.add(index, date);
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View holderView = inflater.inflate(R.layout.view_holder, parent, false);
return new RecyclerViewHolder(holderView, this); // notice how we pass this adapter's interface along with the view
}
// Include other methods (getItemCount, onBindViewHolder, etc.)
// Adapter already has the notifyItemChanged(int index) method so no need to override it
}
下面是一個使用該索引位置和Calendar
對象DialogFragment的例子:
public static class MyDialogFragment extends DialogFragment {
private int index;
private IAdapter adapter;
public static MyDialogFragment newInstance(int index, IAdapter adapter) {
MyDialogFragment f = new MyDialogFragment();
Bundle args = new Bundle();
args.putInt("index", index);
args.putSerializable("adapter", adapter);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
index = args.getInt("index");
adapter = args.getSerializable("adapter");
}
// Build view and set OnClickListener for setting date
}
後用戶更新日期,請調用以下內容:
adapter.setDataAt(index, date);
adapter.notifyItemChanged(index);
我不明白,DialogFragment仍然必須將日期傳回到基礎活動,因爲它也需要一個接口 –
@ArukaJ你需要它嗎?在活動級別將其保存到某種數據庫?然後,您可以創建一個'RecyclerView.AdapterDataObserver',它將在數據更改時偵聽,然後您可以在數據庫上執行必要的操作 – AgileNinja
DialogFragment具有由用戶修改的日曆。 myCalendar.getTime();是我需要訪問適配器中的行的日期。當用戶在該DialogFragment上按OK時,我必須以某種方式將其傳回。 –