我可以使用 Kotlin 合成扩展让两个 xml 布局使用相同的视图吗?

Posted

技术标签:

【中文标题】我可以使用 Kotlin 合成扩展让两个 xml 布局使用相同的视图吗?【英文标题】:Can i have two xml layouts use the same viewholder using Kotlin synthetic extensions? 【发布时间】:2018-02-16 17:18:50 【问题描述】:

我有一个包含可展开行的列表视图。当我单击该行时,我会填充一个非常相似的不同 xml 布局(item_view(左)和item_view_expanded(右))并且具有几乎所有相同的视图,但一些子视图以不同的大小出现(对于例如图像视图被放大),并且在展开的视图中还有一个额外的按钮(保存照片)。

在将此文件转换为 kotlin 并尝试使用 kotlin 综合扩展访问视图时,我收到错误 Overload Resolution Ambiguity。这是有道理的,因为确实有两个 xml 文件具有相同的 id 并且都导入到这个文件中。我看到的大多数 *** 帖子(例如this one)都是通过删除其中一个导入语句或更改 ID 来解决的。但我希望 id 匹配,因为我想要一个可以绑定这两个不同视图的共享 ViewHolder。毕竟,文本视图和图像都是相同的内容,只是视觉布局不同。

我可以在 Java 中使用黄油刀来执行此操作,因为我只是将折叠布局 (download) 中不存在的按钮注释为可为空,并在绑定中进行一些空检查。我想知道如何让两个 xml 布局使用相同的绑定,因为几乎所有内容都是相同的。这可以使用合成扩展在 kotlin 中完成吗?

这是我的 ViewHolder 的 java 代码

   public static class ItemViewHolder extends RecyclerView.ViewHolder 
    @BindView(R.id.tvName) TextView mNameTextView;
    @BindView(R.id.tvRelationship) TextView mRelationshipTextView;
    @BindView(R.id.tvLifespan) TextView mLifespanTextView;
    @BindView(R.id.topDivider) View mTopDividerView;
    @BindView(R.id.bottomDivider) View mBottomDividerView;
    @BindView(R.id.imageView) ImageView mImageView;
    @Nullable
    @BindView(R.id.savePhoto) TextView mSavePhoto;


    public ItemViewHolder(final View view) 
        super(view);
        ButterKnife.bind(this, view);
    

    private void bindItem(final int position, final PathPerson pathPerson, final PathDetailAdapter pathDetailAdapter) 
        // item
        mNameTextView.setTag(position);

        PathUtilities.loadRoundedLeftCornersImageForGender(pathPerson, mImageView);
        mNameTextView.setText(pathPerson.getFullName());
        itemView.setOnClickListener(v -> 
            pathPerson.toggleExpanded();
            pathDetailAdapter.notifyItemChanged(position);
        );
        if (mSavePhoto != null) 
            mSavePhoto.setOnClickListener(v -> 
                // TODO: 9/7/17 download original
                Toast.makeText(itemView.getContext(), R.string.downloading, Toast.LENGTH_SHORT).show();
            );
        

        PathUtilities.setLifespan(pathPerson, mLifespanTextView);
        PathUtilities.setRelationshipTextAndColorForGender(pathPerson, mRelationshipTextView);

        if (position == 1) 
            mTopDividerView.setVisibility(View.VISIBLE);
            mBottomDividerView.setVisibility(View.VISIBLE);
         else if (position == pathDetailAdapter.mPathList.size() - 1) 
            mTopDividerView.setVisibility(View.GONE);
            mBottomDividerView.setVisibility(View.GONE);
         else 
            mTopDividerView.setVisibility(View.GONE);
            mBottomDividerView.setVisibility(View.VISIBLE);
        
    

【问题讨论】:

你找到答案了吗? 【参考方案1】:

原来问题是通过删除其中一个导入语句来解决的。就我而言,我需要保留具有额外下载按钮的那个(两者的超集)

【讨论】:

以上是关于我可以使用 Kotlin 合成扩展让两个 xml 布局使用相同的视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

用于视图的 Kotlin 合成扩展

如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?

Android@Kotlin 界面构建与扩展方法

Android@Kotlin 界面构建与扩展方法

Kotlin入门(33)运用扩展属性

使用 Android 数据绑定时禁用 Kotlin 合成绑定