我正在尝试将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=""
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=""
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=""
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=""
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=""
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=""
app:sub="Feels like " />
</LinearLayout>
</LinearLayout>
出于某种原因,在我的设备上运行时,我将视图视为换行内容。任何帮助将不胜感激。
答案 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)
您是对的,如果您使用WindowManager
和Point.size
,则垂直RecyclerView的高度与Parent不匹配。
我将在此图片中解释您的答案是如何工作的:
要解决此问题,您可以在活动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
...回收者视图将负责将视图附加到自身。