簡體   English   中英

我應該在哪里將setOnClickListener放在RecyclerView適配器中

[英]Where should I place setOnClickListener in a RecyclerView Adapter

在互聯網上的教程中,他們在RecyclerView的Adapter中設置了OnClickListener,它們以兩種方式定義它:在ViewHolder內部或在BindViewHolder內部。

我的問題是哪一個是更好的方法,請推薦任何其他方法(如果有的話)

1)在ViewHolder中:

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View itemView) {
        super(itemView);
        tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
    }

2)在BindViewHolder里面

public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {

    viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
    viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
        }
    });
}    

你提出的1號解決方案是最好的解決方案,因為在notify ..()方法觸發的每個invalidate中,不會在Binding中調用該賦值。 我也知道其他解決方案但你需要在你的活動中實現android.view.GestureDetector。

如果您希望其他人對適配器進行改進,請查看我的FlexibleAdapter https://github.com/davideas/FlexibleAdapter ,隨時在您的項目中實施。

兩種選擇都有其優點和缺點。

例如,如果單擊一個按鈕並且您想要更改按鈕的文本,那么您應該使用在ViewHolder中設置onClick偵聽器的選項。 除此之外,它還使您的代碼看起來更干凈。

但是,如果單擊按鈕,您想要在與單擊的按鈕相同的索引/位置更改TextView的文本,則需要使用在onBindViewHolder方法中設置onClick偵聽器的選項。

恕我直言:我喜歡1號。

由於您調用了new ViewHolder(View)在實際顯示內容之前,您真正設置了new ViewHolder(View) 這很好,因為在調用onBindView時,你的onClickListener已經在你的視圖上設置了。

我認為在構造函數ViewHolder(View)執行此操作也更干凈

ViewHolder()我想,因為你定義了什么view被保持以及它內部和其他功能。

但是onBindViewHolder()你說在ViewHolder定義的view會有這個文本,這個圖像......

您應該始終檢查getAdapterPosition是否> = 0,因為它可能是-1(NO_POSITION),在極少數情況下會導致應用程序崩潰。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder#getadapterposition

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM