あなたはアダプタと通信するためのインタフェースを作成することができます。アダプタが実装する必要があります
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を押すと、何とかそれを返す必要があります。 –