如何为不同的viewHolders创建一个OnClick侦听器

时间:2016-01-08 19:22:55

标签: android recycler-adapter android-viewholder

我的RecyclerView中有不同的视图持有者。在onCreateViewHolder中,我检查viewType然后返回相应的viewHolder

 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        this.mContext = parent.getContext();
        switch (viewType)
        {
            case ITEM_TYPE_HEADER_MAIN:
                return new ViewHolderHeaderMain(MainHeaderView.newInstance(parent));

            case ITEM_VIEW_TYPE_DEFAULT:
                return new ViewHolderDefualt(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.card_list, parent, false), this.mContext);

            case ITEM_VIEW_TYPE_CUSTOM:
                return new ViewHolderCustom(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.story_custom_layout, parent, false), this.mContext);
            default:
                throw new IllegalArgumentException();
        }
    }  

和:

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final StoryModel storyModel = this.mStories.get(position);
        final StoryModel topStory = this.mTopStory;
        if (holder instanceof ViewHolderHeaderMain) {
            ViewHolderHeaderMain viewHolderHeaderMain = (ViewHolderHeaderMain) holder;
            viewHolderHeaderMain.getMainHeaderView().setTopStories(this.mTopStory);

        } else if (holder instanceof ViewHolderDefault){
            ViewHolderDefault viewHolderDefault = (ViewHolderDefault) holder;
            viewHolderDefault.bindStory(this.mStories.get(position));
        } else if (holder instanceof ViewHolderCustom){
            ViewHolderCustom viewHolderCustom = (ViewHolderCustom) holder;
            viewHolderCustom.bindStory(this.mStories.get(position));
        }

这三个viewHolders具有相同的Clickable视图,如TextView用于标题,描述和ImageButton用于溢出菜单,ImageView用于图像。 在那些viewHolders中,我执行数据绑定的视图(不在onBindViewHolder中)。

现在,当谈到onClickListeners时,我必须在每个ViewHolder中实现View.onClickListener。

我的问题是:有没有办法为这些可点击的视图设置一个方法,并为每个视图分配OnClickListener,而不是在每个viewHolder中重复相同的方法?

像:

private void setupClickableViews(final View view, final ViewHolderHeaderMain viewHolderheaderMain) {
        viewHolderheaderMain.tvTitle.setOnClickListener(new View.OnClickListener() {
    ...

我应该在哪里为三个视图持有者定义三种相同的方法。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

让所有视图继承自具有可点击视图的公共抽象父视图附加点击侦听器。

abstract class CommonViewHolder {
  TextView title;
  TextView desc;
  ImageButton menuButton;
  CommonViewHolder() {
    title.setOnClickListener(...);
    desc.setOnClickListener(...);
    menuButton.setOnClickListener(...);
  } 
}

class ViewHolderMain extends CommonViewHolder {
...
}

class ViewHolderDefault extends CommonViewHolder {
...
}

class ViewHolderCustom extends CommonViewHolder {
...
}

答案 1 :(得分:0)

您可以在XML布局中为所有相关视图添加android:onClick="activityOnClick";然后将调用 public void activityOnClick(View view)包装Activity的方法。