【问题标题】:How to add a header to a listView which is inside SwipeRefreshLayout?如何将标题添加到 SwipeRefreshLayout 内的 listView?
【发布时间】:2014-11-20 19:59:29
【问题描述】:

背景

在 ListView 中添加标题视图时,我注意到一个问题(链接 here),以防 ListView 在 SwipeRefreshLayout 中。

问题

问题是,如果标题视图部分可见,并且您向上滚动,您将看到 SwipeRefreshLayout 的圆形视图。

您可以查看上面的链接以观看我正在谈论的视频。

示例代码

这是重现此问题的方法(如果您不想复制粘贴,可以查看上面的链接):

MainActivity.java

public class MainActivity extends ActionBarActivity
  {
  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ListView listView=(ListView)findViewById(android.R.id.list);
    final TextView tv=new TextView(this);
    tv.setText("a very large header view");
    tv.setTextSize(70);
    listView.addHeaderView(tv);
    final SwipeRefreshLayout swipeRefreshLayout=(SwipeRefreshLayout)findViewById(R.id.swipeToRefreshLayout);
    swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener()
      {
        @Override
        public void onRefresh()
          {
          new Handler().postDelayed(new Runnable()
            {
              @Override
              public void run()
                {
                swipeRefreshLayout.setRefreshing(false);
                }
            },1000);
          }
      });
    final ArrayList<String> arrayList=new ArrayList<String>();
    for(int i=0;i<1000;++i)
      arrayList.add(Integer.toString(i));
    listView.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList));
    }
  }

res/layout/activity_main.xml

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeToRefreshLayout"
    android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@android:color/transparent"
        android:fastScrollEnabled="true"
        android:footerDividersEnabled="true"
        android:headerDividersEnabled="true"
        android:paddingEnd="4dp"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:paddingStart="4dp"
        android:scrollingCache="false"
        android:smoothScrollbar="false"
        android:textFilterEnabled="true"/>

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

问题

有没有办法解决这个问题?

我想我可以为 listView 使用多种类型,但是否有其他更优雅、更简单或以其他方式更好的解决方案?

【问题讨论】:

  • 是的,但是它在ListView之上,不允许查看它所属的SwipeRefreshLayout的圆形视图。此外,TextView 将无法滚动,并且以这种方式成为 listView 的一部分。

标签: android android-listview swiperefreshlayout


【解决方案1】:

Android issue 78375 非常相似。 尝试覆盖 SwipeRefreshLayout#canChildScrollUp

@Override
public boolean canChildScrollUp() {
    View target = getChildAt(0);
    if (target instanceof AbsListView) {
        final AbsListView absListView = (AbsListView) target;
        return absListView.getChildCount() > 0
                && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                .getTop() < absListView.getPaddingTop());
    } else {
        return target.getScrollY() > 0;
    }
}

【讨论】:

  • 谢谢。现在将其标记为正确答案,直到 Google 解决此问题。说,如果你在 RecyclerView 方面做得很好,你可以看看这个:stackoverflow.com/questions/27798212/… 吗?
【解决方案2】:

编辑:即使我为 ListView 使用多类型项目,它似乎也会发生。后来我发现它总是出现在 listView 上的第一项。

如果第一项足够大,那么很容易重现。

所以,目前有一个简单的解决方法:

在以任何方式使用列表视图之前,先添加一个空视图作为标题视图,并且永远不要删除它:

listView.addHeaderView(new View(this));

这样,由于视图实际上是不可见的,因此错误不会显示给用户。

这只是一种解决方法,但我认为最好的办法应该是解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多