xuxiuxi
2017-05-12 e1bcafb39828e18a3605d94aad20376484b56b26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package cn.com.basic.face.pulltorefresh;
 
 
 
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
 
 
 
public abstract class PullToRefreshAdapterViewBase<T extends AbsListView> extends PullToRefreshBase<T> implements
        OnScrollListener {
 
    private int lastSavedFirstVisibleItem = -1;
    private OnScrollListener onScrollListener;
    private OnLastItemVisibleListener onLastItemVisibleListener;
    private View emptyView;
    private FrameLayout refreshableViewHolder;
    private ImageView mTopImageView;
 
    public PullToRefreshAdapterViewBase(Context context) {
        super(context);
        refreshableView.setOnScrollListener(this);
    }
 
    public PullToRefreshAdapterViewBase(Context context, int mode) {
        super(context, mode);
        refreshableView.setOnScrollListener(this);
    }
 
    public PullToRefreshAdapterViewBase(Context context, AttributeSet attrs) {
        super(context, attrs);
        refreshableView.setOnScrollListener(this);
    }
 
    abstract public ContextMenuInfo getContextMenuInfo();
 
    public final void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
                               final int totalItemCount) {
 
        if (null != onLastItemVisibleListener) {
            // detect if last item is visible
            if (visibleItemCount > 0 && (firstVisibleItem + visibleItemCount == totalItemCount)) {
                // only process first event
                if (firstVisibleItem != lastSavedFirstVisibleItem) {
                    lastSavedFirstVisibleItem = firstVisibleItem;
                    onLastItemVisibleListener.onLastItemVisible();
                }
            }
        }
 
        if (null != onScrollListener) {
            onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
        }
    }
 
    public final void onScrollStateChanged(final AbsListView view, final int scrollState) {
        if (null != onScrollListener) {
            onScrollListener.onScrollStateChanged(view, scrollState);
        }
    }
 
    public void setBackToTopView(ImageView mTopImageView){
        this.mTopImageView = mTopImageView;
        mTopImageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (refreshableView instanceof ListView ) {
                    ((ListView)refreshableView).setSelection(0);
                }else if(refreshableView instanceof GridView){
                    ((GridView)refreshableView).setSelection(0);
                }
            }
        });
    }
 
    /**
     * Sets the Empty View to be used by the Adapter View.
     *
     * We need it handle it ourselves so that we can Pull-to-Refresh when the
     * Empty View is shown.
     *
     * Please note, you do <strong>not</strong> usually need to call this method
     * yourself. Calling setEmptyView on the AdapterView will automatically call
     * this method and set everything up. This includes when the Android
     * Framework automatically sets the Empty View based on it's ID.
     *
     * @param newEmptyView
     *            - Empty View to be used
     */
    public final void setEmptyView(View newEmptyView) {
        // If we already have an Empty View, remove it
        if (null != emptyView) {
            refreshableViewHolder.removeView(emptyView);
        }
 
        if (null != newEmptyView) {
            ViewParent newEmptyViewParent = newEmptyView.getParent();
            if (null != newEmptyViewParent && newEmptyViewParent instanceof ViewGroup) {
                ((ViewGroup) newEmptyViewParent).removeView(newEmptyView);
            }
 
            this.refreshableViewHolder.addView(newEmptyView, ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
        }
 
        if (refreshableView instanceof EmptyViewMethodAccessor) {
            ((EmptyViewMethodAccessor) refreshableView).setEmptyViewInternal(newEmptyView);
        } else {
            this.refreshableView.setEmptyView(newEmptyView);
        }
    }
 
    public final void setOnLastItemVisibleListener(OnLastItemVisibleListener listener) {
        onLastItemVisibleListener = listener;
    }
 
    public final void setOnScrollListener(OnScrollListener listener) {
        onScrollListener = listener;
    }
 
    protected void addRefreshableView(Context context, T refreshableView) {
        refreshableViewHolder = new FrameLayout(context);
        refreshableViewHolder.addView(refreshableView, ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        addView(refreshableViewHolder, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1.0f));
    };
 
    protected boolean isReadyForPullDown() {
        return isFirstItemVisible();
    }
 
    protected boolean isReadyForPullUp() {
        return isLastItemVisible();
    }
 
    private boolean isFirstItemVisible() {
        if (this.refreshableView.getCount() == 0) {
            return true;
        } else if (refreshableView.getFirstVisiblePosition() == 0) {
 
            final View firstVisibleChild = refreshableView.getChildAt(0);
 
            if (firstVisibleChild != null) {
                return firstVisibleChild.getTop() >= refreshableView.getTop();
            }
        }
 
        return false;
    }
 
    private boolean isLastItemVisible() {
        final int count = this.refreshableView.getCount();
        final int lastVisiblePosition = refreshableView.getLastVisiblePosition();
 
        if (count == 0) {
            return true;
        } else if (lastVisiblePosition == count - 1) {
 
            final int childIndex = lastVisiblePosition - refreshableView.getFirstVisiblePosition();
            final View lastVisibleChild = refreshableView.getChildAt(childIndex);
 
            if (lastVisibleChild != null) {
                return lastVisibleChild.getBottom() <= refreshableView.getBottom();
            }
        }
        return false;
    }
}