我有一个名为EventItemView
的自定义视图,我在两者一个XML文件和一个自定义适配器(扩展RecyclerView.Adapter
中使用它,并在{ {1}})。我的问题是它在RecyclerView
中的外观很奇怪,但在我的XML文件中却没有:
我相信这是由于我在我的适配器中实现视图的方式,通过执行RecyclerView
并且不传递它可能需要的其他参数new EventItemView(context)
来呈现像XML版本。问题是我不知道如何在适配器中获取它们。
这是自定义视图声明:
EventItemView.java
AttributeSet, int, int
布局/ view_event_item.xml
public class EventItemView extends FrameLayout {
public EventItemView(Context context) {
this(context, null);
}
public EventItemView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public EventItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr, 0);
init(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EventItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs, defStyleAttr, defStyleRes);
}
protected void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
eventItem = new EventItem();
inflate(context, R.layout.view_event_item, this);
ButterKnife.bind(this);
TypedArray values = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EventItemView, defStyleAttr, defStyleRes);
try {
setSubtitle(values.getString(R.styleable.EventItemView_subtitle));
...
}
finally {
values.recycle();
}
}
}
此视图随后用于1) activity.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/selector_item_event"
android:clickable="true"
android:gravity="center"
android:layout_height="72dp"
android:layout_width="match_parent"
android:orientation="horizontal"
android:padding="16dp">
...
</LinearLayout>
Adapter.java :中的和2)
<com.app.package.view.EventItemView
android:id="@+id/current_event_view"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
如何使用相关的@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
EventItemView itemView = new EventItemView(context);
return new ViewHolder(itemView);
}
,attrs
和defStyleAttr
构造函数参数正确实例化自定义视图?或者,出于完全不同的原因,这种观点可能会以一种奇怪的方式表现出来?
答案 0 :(得分:0)
您需要致电measure()
,然后致电layout()
。
实例化的自定义视图并不知道需要扩展到的大小,因此您需要通过这些调用传递它。
答案 1 :(得分:0)
通过更改
解决了我的问题public class EventItemView extends FrameLayout
到
public class EventItemView extends RelativeLayout
我只是不明白为什么。