2016-01-21 28 views
2

我想要使用回收視圖和處理單擊事件。我已閱讀了各種處理onClick事件的方法,如回收查看項目,如:靜態ViewHolder和獲取上下文時使用RecyclerView

  1. 定義視圖持有者類本身內的點擊偵聽器。
  2. 定義onCreateViewHolder()中的點擊偵聽器。
  3. 定義一個接口,然後從那裏走(似乎太多的工作)。

所以我的第一個問題是哪個選項更好? 我目前正在使用第一種方法,如果在視圖持有者類本身中定義點擊偵聽器是要走的路,那麼如何使用適配器的上下文作爲視圖持有者類是靜態的。

基本上,我想要一個靜態視圖持有者和點擊事件,打開一個新的活動,我需要的上下文。

更新:添加適配器和ViewHolder代碼。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

private Context mContext; 
private List<Job> jobs; 

public MyAdapter(Context context, List<Job> jobs) { 
    mContext = context; 
    this.jobs = jobs; 
} 

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemLayoutView = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.list_item, viewGroup, false); 

    itemLayoutView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(mContext, MyActivity.class); 
      mContext.startActivity(intent); 
     } 
    }); 

    return new ViewHolder(itemLayoutView); 
} 

@Override 
public void onBindViewHolder(WorkExperienceAdapter.ViewHolder viewHolder, int i) { 
     //bindViewHolder code 
    } 
} 

@Override 
public int getItemCount() { 
    return jobs.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    @InjectView(R.id.current) 
    TextView mCurrent; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     ButterKnife.inject(this, itemView); 
    } 
} 

}

+0

你的第一個問題,哪種方法更好,將主要基於產量輿論答案,這是不適合SO格式。 –

+0

是的,但我想知道在比較前兩種方法時是否存在性能差異。 – akshayt23

回答

3

在視圖架的構造,我們得到視圖類的對象。您可以使用該對象來獲取上下文,例如:

class Holder extends RecyclerView.ViewHolder { 

    public Holder(View itemView) { 
    super(itemView); 
    Context context = itemView.getContext(); 
    } 

} 
+0

嗨,我實際上嘗試過這種方法,但它不起作用,因爲'itemView.getContext()'不返回活動上下文,因此不可能使用它開始另一個活動。 – akshayt23

+0

在onBindViewHolder()方法中設置監聽器怎麼樣? –

+0

@ user2558050'itemView.getContext()'返回一個'Context',所以用它來調用'startActivity()' – pskink

0

嘗試使用活動的參考。

ActivityOne.this.startActivity(intent); 

如果這樣不起作用,那麼知道startActivity是任何Context的一種方法。

class MessageViewHolderOfFriend extends RecyclerView.ViewHolder { 

    private final Context context; 

    public MessageViewHolderOfFriend(View v) { 
     super(v); 
     context = v.getContext(); 

     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(context,NewActivityToRun.class); 
       context.startActivity(intent); 
      } 
     }); 

    } 

REF:

相關問題