Android SwipeRefresh 中的 ScrollView 中的 RecyclerView 不可见

Android RecyclerView in ScrollView in SwipeRefresh is not visible

我在 ScrollView 里面有 RecyclerView,它在 SwipeRefresh 布局里面。我在 RecyclerView 上几乎没有布局,但我的 RecyclerView 不可见,即使我从 ScrollView 中删除了其他布局。你有什么建议?我需要以某种方式将列表放在 ScrollView 中的某些布局下方。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <include layout="@layout/toolbar"></include>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">    
                ....
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/simpleList"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

        </ScrollView>
    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

试图给出具体的高度但仍然不可见o.O

如果我 RecyclerView 替换为 ListView,则列表可见。

如果您想让列表中的所有项目始终可见,请将 RecyclerView 替换为 LinearLayout 并将您的项目添加到其中。

一个例子:

your_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">

        <include layout="@layout/toolbar"></include>

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true">    
                    ....
                    <LinearLayout
                        android:id="@+id/simpleList"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical"/>

            </ScrollView>
        </android.support.v4.widget.SwipeRefreshLayout>

    </LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/item_text"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/abc_ic_ab_back_mtrl_am_alpha"/>

</LinearLayout>

在您的 Java 代码中:

首先声明列表

mSimpleList = (LinearLayout) findViewById(R.id.simpleList);

然后添加项目的方法

public void addListItems(ArrayList<String> strings) {
    LayoutInflater inflater = LayoutInflater.from(this);
    for(String s : strings) {
        View item = inflater.inflate(R.layout.item_layout, mSimpleList, false);
        TextView text = (TextView) item.findViewById(R.id.item_text);
        text.setText(s);
        mSimpleList.addView(item);//you can add layout params if you want
    }
}

我之前的回答是阻止向下滚动。因此,一个好的解决方法是将您的 Stuff 添加为 RecyclerView 的第一个元素。这可以使用适配器轻松实现。这样你仍然可以滚动你的东西以及你的实际列表元素。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/toolbar"></include>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

                  <android.support.v7.widget.RecyclerView
                    android:id="@+id/simpleList"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_below="@+id/your_stuff" />

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

并使用类似以下内容的适配器实现,

  public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    class YourStuffViewHolder extends RecyclerView.ViewHolder {
        //
    }

    class ViewHolderListItem extends RecyclerView.ViewHolder {
        //
    }

    @Override
    public int getItemViewType(int position) {

          if(position>0){
               return 1;
          }
          return 0;

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: return new YourStuffViewHolder();
             case 1: return new ViewHolderListItem ();
         }
    }
}

我只需要将 android:fillViewport="true" 放到 SwipeRefreshLayout。现在 RecyclerView 可见。