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

时间:2017-09-07 21:24:12

标签: android xml android-layout kotlin

我有一个包含可扩展行的列表视图。当我点击该行时,我会膨胀一个非常相似的不同xml布局(item_view(左)和item_view_expanded(右))并且几乎所有相同的视图,但是一些子视图出现在不同尺寸(例如放大图像视图),展开视图中还有一个附加按钮(保存照片)。

Collapsed View Expanded View

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

我可以使用butterknife在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 个答案:

答案 0 :(得分:0)

通过删除其中一个import语句来解决问题。在我的情况下,我需要保留一个有额外下载按钮(两个超集)的那个