将垂直Recyclerview项目视图设置为height = match_parent与设备的高度不匹配

时间:2015-11-11 22:06:29

标签: android xml android-recyclerview

我正在尝试将recyclelerview上第一个视图的高度设置为match_parent。 也就是说,第一个视图应该覆盖整个设备。 这是第一个视图的XML,注意高度和宽度设置为match_parent

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentPadding="14dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/main_icon"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="IC"
            android:textSize="100sp" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/temp"
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:gravity="center"
                android:text="12°"
                android:textColor="@color/normal_text"
                android:textSize="86dp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="LIGHT SNOW"
                android:textColor="@color/light_text"
                android:textSize="14dp" />


        </LinearLayout>


    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="20dp"

        android:paddingRight="20dp"
        android:paddingTop="20dp">

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/humidity"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf07a;"
            app:sub="Humid." />

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/tempMax"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf050;"
            app:sub="East" />

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/tempMin"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf079;"
            app:sub="Press." />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="20dp">

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/clouds"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf013;"
            app:sub="Cluds" />

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/precipitation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf084;"
            app:sub="0.29 mm" />

        <com.feresr.rxweather.UI.views.InfoDisplay
            android:id="@+id/feels_like"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:ic="&#xf055;"
            app:sub="Feels like " />
    </LinearLayout>
</LinearLayout>

出于某种原因,在我的设备上运行时,我将视图视为换行内容。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我最终在运行时计算高度并将其设置为我的视图。

        URL url = new URL("https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&explaintext=&generator=random&grnnamespace=0");
        HttpURLConnection request = (HttpURLConnection) url.openConnection();
        request.connect();

        JsonElement jsonElement = new JsonParser().parse(new InputStreamReader((InputStream) request.getContent()));
        JsonElement pages = jsonElement.getAsJsonObject().get("query").getAsJsonObject().get("pages");

        Set<Entry<String, JsonElement>> entrySet = pages.getAsJsonObject().entrySet();

        JsonElement yourDesiredElement = null;

        for(Map.Entry<String,JsonElement> entry : entrySet){
            yourDesiredElement = entry.getValue();
        }

        //null check for yourDesiredElement

如果有人知道如何在XML上执行此操作,我可以更改已接受的答案。

答案 1 :(得分:1)

您是对的,如果您使用WindowManagerPoint.size,则垂直RecyclerView的高度与Parent不匹配。 我将在此图片中解释您的答案是如何工作的:

enter image description here

要解决此问题,您可以在活动ViewTreeObserver中使用onCreate这样的内容:

ViewTreeObserver vto = recyclerViewItems.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            recyclerViewItems.getViewTreeObserver().removeOnPreDrawListener(this);
            //get height of RecyclerView's Match Parent
            finalHeight = recyclerViewItems.getMeasuredHeight();           

            LinearLayoutManager itemsLayoutManager = new LinearLayoutManager(getApplicationContext());
            itemsLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerViewItems.setLayoutManager(itemsLayoutManager);
            VerticalAdapter verticalAdapter = new VerticalAdapter(DataList<>());
            recyclerViewItems.setAdapter(verticalAdapter);
            return true;
        }
    });

答案 2 :(得分:1)

XML布局中的match_parent是否有效取决于它的膨胀方式。因此,为了使视图持有者中的android:layout_height="match_parent"能够正常工作,我们的列表项视图应该如下所示:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.viewholder, recyclerView, false);

关于上述代码需要注意的几个重要事项是:

  • LayoutInflater.inflate(resource,root,attachToRoot)是用于夸大列表项视图的方法。

  • 对回收者视图的引用已作为root参数传递到inflate方法中。 这很重要,因为当膨胀的XML的根节点遇到match_parent时,它会匹配root View的维度。

  • false被传递到inflate参数的attachToRoot方法。 这很重要,因为我们实际上并不希望inflater将膨胀的视图附加到root ...回收者视图将负责将视图附加到自身。

other stackoverflow answer非常相关。