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

其中i爲項目的索引進行更新。

+0

如何?來自界面的重寫功能必須放回到底層活動 –