我可以使用 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 布局使用相同的视图吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?