Android 水平回收视图跟随第一个项目高度和包裹内容

Android 水平回收视图跟随第一个项目高度和包裹内容,android,android-recyclerview,Android,Android Recyclerview,我有一个水平布局的RecyclerView。各个适配器项的高度可能取决于项的内容 因此,理论上它可以如下所示: 我现在的问题是,它似乎只关心第一个问题的高度,因为我得到的结果如下所示: 你可以看到,第四项被切断。然而,如果我把最高的项目放在第一位,它就完美地工作了 并摆脱显而易见的解决方案;我不知道这些东西的高度。我只能在测试时这样做 -- adapter_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo

我有一个水平布局的
RecyclerView
。各个适配器项的高度可能取决于项的内容

因此,理论上它可以如下所示:

我现在的问题是,它似乎只关心第一个问题的高度,因为我得到的结果如下所示:

你可以看到,第四项被切断。然而,如果我把最高的项目放在第一位,它就完美地工作了

并摆脱显而易见的解决方案;我不知道这些东西的高度。我只能在测试时这样做

--

adapter_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:animateLayoutChanges="true"
    android:padding="@dimen/padding_view_small">

    <ImageView
        android:id="@+id/image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        app:srcCompat="@drawable/flamme"/>

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:layout_marginTop="@dimen/padding_view_small"
        android:text="@string/placeholder"
        android:gravity="center_horizontal"/>

</LinearLayout>

将imageview高度更改为包裹内容。我不确定,就这样试试。

试试这个。不管怎样,你的问题解决了吗

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        final int newHeight = recyclerView.getMeasuredHeight();
        if (0 != newHeight && minHeight < newHeight) {
        // keep track the height and prevent recycler view optimizing by resizing
            minHeight = newHeight;
            recyclerView.setMinimumHeight(minHeight);
        }
    }
});
mRecyclerView.addOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
CrollStateChanged上的公共void(@NonNull RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
final int newHeight=recyclerView.getMeasuredHeight();
如果(0!=newHeight&&minHeight
由于这个问题越来越吸引人,而且我只在评论中发布了我的个人解决方案,所以我也将提交一个答案

--


我决定利用图书馆来达到我的目的。它非常可定制,我建议尝试解决类似问题的人使用它。

使用
StaggedGridLayoutManager
我决定使用谷歌FlexBox的FlexboxLayoutManager来均匀显示所有项目。在使用它之后,我想最好是让所有项目同时显示,而不是滚动显示。尝试删除setHasFixedSize属性,我也面临同样的问题,然后我删除了此属性。
...
final ProductPictogramAdapter symbolAdapter = new ProductPictogramAdapter();
final View symbolListParent = findViewById(R.id.symbol_list_parent);
RecyclerView symbolList = findViewById(R.id.symbol_list);
symbolList.setLayoutManager(new LinearLayoutManager(ProductDetailActivity.this, LinearLayoutManager.HORIZONTAL, false));
symbolList.setAdapter(symbolAdapter);
symbolList.setHasFixedSize(true);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        final int newHeight = recyclerView.getMeasuredHeight();
        if (0 != newHeight && minHeight < newHeight) {
        // keep track the height and prevent recycler view optimizing by resizing
            minHeight = newHeight;
            recyclerView.setMinimumHeight(minHeight);
        }
    }
});