Pulltorefresh使用中碰到的问题

第一 在使用XScrollView布局是,无法在该布局.xml文件,放置内容布局控件,假如放置了会报错,

    <com.markmao.pulltorefresh.widget.XScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/page_top"
        android:fillViewport="true"
        android:scrollbars="none" >
</com.markmao.pulltorefresh.widget.XScrollView>

XScrollView,通过看下面的代码你会发现该控件在初始化时已经去动态添加了一个子控件,假如你再去放置内容布局肯定会报错,因为android针对ScrollView的默认设置是只允许包含唯一子空间

public class XScrollView extends ScrollView implements OnScrollListener {
private LinearLayout mLayout;
    private LinearLayout mContentLayout;
public XScrollView(Context context) {
        super(context);
        initWithContext(context);
    }
public XScrollView(Context context, AttributeSet attrs) { super(context, attrs); initWithContext(context); } public XScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initWithContext(context); } private void initWithContext(Context context) { mLayout = (LinearLayout) View.inflate(context, R.layout.vw_xscrollview_layout, null); mContentLayout = (LinearLayout) mLayout.findViewById(R.id.content_layout);this.addView(mLayout); }

该控件源主如何让用户可以嵌套使用者自定义的布局了,我们先看看 

R.layout.vw_xscrollview_layout 该布局文件的内部,头部与顶部的咱们先不用管,就看中间的,ID值为 content_layout,默认我们的自定义布局是放置嵌套在其中的
<?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">

    <LinearLayout
        android:id="@+id/header_layout"
        android:layout_gravity="center_horizontal|top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/content_layout"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/footer_layout"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:tag="ttttt"
        android:orientation="vertical" />

</LinearLayout>
    public void setContentView(ViewGroup content) {
        if (mLayout == null) 
            return;
        if (mContentLayout == null) 
            mContentLayout = (LinearLayout) mLayout.findViewById(R.id.content_layout);
        
        if (mContentLayout.getChildCount() > 0) 
            mContentLayout.removeAllViews();
        mContentLayout.addView(content);
    }

    public void setView(View content) {
        if (mLayout == null) 
            return;
        if (mContentLayout == null) 
            mContentLayout = (LinearLayout) mLayout.findViewById(R.id.content_layout);
        mContentLayout.addView(content);
    }

 外部引入 ,设置内容的函数有两个,setContentView,setView

View content = LayoutInflater.from(this).inflate(R.layout.vw_scroll_view_content, null);
scrollview.setContentView()content;

针对这样的情况,看个人因素,假如觉得新增一个布局文件无所谓的话也没事,个人的强迫症太厉害,不喜欢这样,感觉不简洁,所以稍微简单的修改了下

下面的布局文件还是用一个使用XScrollView的布局文件,内容布局也放置在该文件中,但是跟XScrollView就不是父子的关系,而是同级的,ID值 xcollview_content,就是内容布局,接下来就看代码的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/test_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.markmao.pulltorefresh.widget.XScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/page_top"
        android:fillViewport="true"
        android:scrollbars="none" >
    </com.markmao.pulltorefresh.widget.XScrollView>

    <LinearLayout
        android:id="@+id/xcollview_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/scroll_view"
        android:background="@color/transparent"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/content_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="#00000000"
            android:scrollbars="none" />
    </LinearLayout>

</RelativeLayout>

代码变动,在XScrollView中新增函数 ,需要注意的一个空间它只允许有一个父控件,到此步就结束了第一个问题

    public void setDView(View content) {
        if (mLayout == null) 
            return;
        if (mContentLayout == null) 
            mContentLayout = (LinearLayout) mLayout.findViewById(R.id.content_layout);
ViewParent parent
= this.getParent(); if (parent instanceof RelativeLayout) { RelativeLayout r_parent = (RelativeLayout) parent; r_parent.removeView(content); } if (parent instanceof LinearLayout) { LinearLayout l_parent = (LinearLayout) parent; l_parent.removeView(content); } mContentLayout.addView(content); }

原文地址:https://www.cnblogs.com/ak23173969/p/4983088.html