0

私のRecyclerViewアダプタでは、私の行は日付を表示するTextViewsを持っています。ユーザーがTextViewをクリックすると、ユーザーが時間と日付を選択できるDialogFragmentが表示され、その後、Dateがインターフェイスを介して返されます。RecyclerViewの行でこの日付の更新を実行するにはどうすればよいですか?

しかし、私はTextViewに追加したonClickメソッドで日付を取得する方法がわかりません。

public class RecyclerViewHolder extends RecyclerView.ViewHolder { 
     public TextView dateTextView; 
     public RecyclerViewHolder(View itemView) { 
      super(itemView); 
      dateTextView = (TextView) itemView.findViewById(R.id.date_textview); 

      dateTextView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //I can call my DialogFragment here but then what? 
       } 
      }); 

答えて

2

あなたはアダプタと通信するためのインタフェースを作成することができます。アダプタが実装する必要があります

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); 
+0

私は理解していません。DialogFragmentは、あまりにもインターフェイスが必要なので、元のアクティビティに日付を渡す必要があります。 –

+0

@ArukaJ必要ですか?アクティビティレベルでそれをある種のデータベースに保存しますか?次に、データが変更されたときにリッスンし、データベースで必要な操作を実行できる 'RecyclerView.AdapterDataObserver'を作成できます。 – AgileNinja

+0

DialogFragmentには、ユーザーが変更するカレンダーがあります。 myCalendar.getTime();アダプターの行のアクセスが必要な日付です。そのDialogFragmentでユーザーがOKを押すと、何とかそれを返す必要があります。 –

0

私はアイテムのインデックスを更新する

RecyclerView.notifyItemChanged(i); 

を試してみてください。

+0

どのようにですか?インターフェイスのオーバーライドされた関数を基になるアクティビティに戻す必要があります –

関連する問題