我在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 /布局/ 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使用多种类型,但是有没有其他解决方案更优雅,更简单或更好?
答案 0 :(得分:1)
编辑:即使我为ListView使用多类型项目,它似乎也会出现。后来我发现它总是出现在listView的第一个项目上。
如果第一项足够大,则很容易重现。
所以,目前,有一个简单的解决方法:
在以任何方式使用listview之前,首先添加一个空视图作为标题视图,并且永远不要删除它:
listView.addHeaderView(new View(this));
这样,由于视图几乎不可见,因此不会向用户显示错误。
这只是一种解决方法,但我认为最好的办法是解决这个问题。
答案 1 :(得分: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;
}
}