以编程方式以正确的方式实例化自定义视图

时间:2016-08-08 13:00:18

标签: android android-custom-view

我有一个名为EventItemView的自定义视图,我在两者一个XML文件和一个自定义适配器(扩展RecyclerView.Adapter中使用它,并在{ {1}})。我的问题是它在RecyclerView中的外观很奇怪,但在我的XML文件中却没有:

enter image description here

  1. 使用XML
  2. 声明
  3. 在我的适配器中动态实例化
  4. 我相信这是由于我在我的适配器中实现视图的方式,通过执行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); } attrsdefStyleAttr构造函数参数正确实例化自定义视图?或者,出于完全不同的原因,这种观点可能会以一种奇怪的方式表现出来?

2 个答案:

答案 0 :(得分:0)

您需要致电measure(),然后致电layout()

实例化的自定义视图并不知道需要扩展到的大小,因此您需要通过这些调用传递它。

答案 1 :(得分:0)

通过更改

解决了我的问题
public class EventItemView extends FrameLayout

public class EventItemView extends RelativeLayout

我只是不明白为什么。