【发布时间】:2018-02-16 17:18:50
【问题描述】:
我有一个包含可展开行的列表视图。当我单击该行时,我会填充一个非常相似的不同 xml 布局(item_view(左)和item_view_expanded(右))并且具有几乎所有相同的视图,但一些子视图以不同的大小出现(对于例如图像视图被放大),并且在展开的视图中还有一个额外的按钮(保存照片)。
在将此文件转换为 kotlin 并尝试使用 kotlin 综合扩展访问视图时,我收到错误 Overload Resolution Ambiguity。这是有道理的,因为确实有两个 xml 文件具有相同的 id 并且都导入到这个文件中。我看到的大多数 stackoverflow 帖子(例如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);
}
}
}
【问题讨论】:
-
你找到答案了吗?
标签: android xml android-layout kotlin