2016-03-01 182 views
2

我創建了一個RecyclerView適配器,我想開始一個活動點擊行時:RecyclerView Click事件

public override OnBindViewHolder(RecyclerView.ViewHolder holder, int position) 
{ 
    MyViewHolder viewHolder = (MyViewHolder)holder; 

    viewHolder.MyView.Click += (sender, e) => 
    { 
     var context = viewHolder.MyView.Context; 
     var intent = new Intent(context, typeof(DetailActivity)); 
     context.StartActivity(intent); 
    } 
} 

當我點擊第一行會帶我去的活動像我想要。如果我向下滾動,以便第一行反彈,然後再次滾動到頂部,然後單擊第一行,然後我的Click事件觸發兩次。一次爲綁定的第一行,然後再次爲滾動時綁定的行。

是否有您需要處理的事件來取消註冊點擊事件?

+0

嘗試訂閱OnCreateViewHolder上的事件。 –

回答

4

我相信標準模式是在ViewHolder的構造函數中設置clickhandlers。然後在OnBindViewHolder中,更新ViewHolder中的Views/Data。

像這樣的東西(未編譯的代碼):

適配器:

public override OnBindViewHolder() 
{ 
    MyViewHolder viewHolder = (MyViewHolder)holder; 

    viewHolder.SetData(whatever data you care about); 
} 

MyViewHolder:

public MyViewHolder(View view) : base(view) 
{ 
    MainView = view; 
    MainView.Click += (sender, e) => 
    { 
     var context = MainView.Context; 
     var intent = new Intent(context, typeof(DetailActivity)); 
     context.StartActivity(intent); 
    } 
} 

這樣做,這樣通過把業務邏輯在ViewHolder保持適配器清潔,並且還可以防止您的點擊處理程序在您滾動時不斷設置和拆除。