Skip to content

Commit 730d40c

Browse files
author
Relex
committed
add scroll view sample
1 parent c48503c commit 730d40c

12 files changed

+235
-78
lines changed

apk/app-debug.apk

2.5 KB
Binary file not shown.

app/src/main/assets/lorem.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
2+
3+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
4+
5+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
6+
7+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

app/src/main/java/me/relex/viewpagerheaderscrolldemo/MainActivity.java

+23-12
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,25 @@
1313
import android.view.ViewConfiguration;
1414
import android.view.animation.DecelerateInterpolator;
1515
import android.view.animation.Interpolator;
16+
import me.relex.viewpagerheaderscrolldemo.fragment.ListViewFragment;
17+
import me.relex.viewpagerheaderscrolldemo.fragment.ScrollViewFragment;
18+
import me.relex.viewpagerheaderscrolldemo.tools.ScrollableFragmentListener;
19+
import me.relex.viewpagerheaderscrolldemo.tools.ScrollableListener;
1620
import me.relex.viewpagerheaderscrolldemo.tools.ViewPagerHeaderHelper;
1721
import me.relex.viewpagerheaderscrolldemo.widget.SlidingTabLayout;
1822
import me.relex.viewpagerheaderscrolldemo.widget.TouchCallbackLayout;
1923

2024
public class MainActivity extends ActionBarActivity
21-
implements TouchCallbackLayout.TouchEventListener,
22-
ItemFragment.OnFragmentInteractionListener, ViewPagerHeaderHelper.OnViewPagerTouchListener {
25+
implements TouchCallbackLayout.TouchEventListener, ScrollableFragmentListener,
26+
ViewPagerHeaderHelper.OnViewPagerTouchListener {
2327

2428
private static final long DEFAULT_DURATION = 300L;
2529
private static final float DEFAULT_DAMPING = 1.5f;
2630

27-
private SparseArrayCompat<ItemFragment> mFragmentArrays = new SparseArrayCompat<ItemFragment>();
31+
private SparseArrayCompat<ScrollableListener> mScrollableListenerArrays =
32+
new SparseArrayCompat<>();
2833
private ViewPager mViewPager;
2934
private View mHeaderLayoutView;
30-
3135
private ViewPagerHeaderHelper mViewPagerHeaderHelper;
3236

3337
private int mTouchSlop;
@@ -53,7 +57,7 @@ protected void onCreate(Bundle savedInstanceState) {
5357
mHeaderLayoutView = findViewById(R.id.header);
5458

5559
SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.tabs);
56-
slidingTabLayout.setDistributeEvenly(true);
60+
//slidingTabLayout.setDistributeEvenly(true);
5761

5862
mViewPager = (ViewPager) findViewById(R.id.viewpager);
5963
mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
@@ -74,7 +78,8 @@ protected void onCreate(Bundle savedInstanceState) {
7478
}
7579

7680
@Override public boolean isViewBeingDragged(MotionEvent event) {
77-
return mFragmentArrays.valueAt(mViewPager.getCurrentItem()).isViewBeingDragged(event);
81+
return mScrollableListenerArrays.valueAt(mViewPager.getCurrentItem())
82+
.isViewBeingDragged(event);
7883
}
7984

8085
@Override public void onMoveStarted(float y) {
@@ -170,12 +175,12 @@ private void headerExpand(long duration) {
170175
mViewPagerHeaderHelper.setHeaderExpand(true);
171176
}
172177

173-
@Override public void onFragmentAttached(ItemFragment fragment, int position) {
174-
mFragmentArrays.put(position, fragment);
178+
@Override public void onFragmentAttached(ScrollableListener listener, int position) {
179+
mScrollableListenerArrays.put(position, listener);
175180
}
176181

177-
@Override public void onFragmentDetached(ItemFragment fragment, int position) {
178-
mFragmentArrays.remove(position);
182+
@Override public void onFragmentDetached(ScrollableListener listener, int position) {
183+
mScrollableListenerArrays.remove(position);
179184
}
180185

181186
private class ViewPagerAdapter extends FragmentPagerAdapter {
@@ -186,12 +191,16 @@ public ViewPagerAdapter(FragmentManager fm) {
186191

187192
@Override
188193
public Fragment getItem(int position) {
189-
return ItemFragment.newInstance(position);
194+
195+
if (position == 3) {
196+
return ScrollViewFragment.newInstance(position);
197+
}
198+
return ListViewFragment.newInstance(position);
190199
}
191200

192201
@Override
193202
public int getCount() {
194-
return 3;
203+
return 4;
195204
}
196205

197206
@Override
@@ -203,6 +212,8 @@ public CharSequence getPageTitle(int position) {
203212
return getString(R.string.tab_continent);
204213
case 2:
205214
return getString(R.string.tab_city);
215+
case 3:
216+
return getString(R.string.tab_scroll_view);
206217
}
207218

208219
return "";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package me.relex.viewpagerheaderscrolldemo.delegate;
2+
3+
import android.graphics.Rect;
4+
import android.view.MotionEvent;
5+
import android.view.View;
6+
import android.widget.ScrollView;
7+
8+
public class ScrollViewDelegate implements ViewDelegate {
9+
private final int[] mViewLocationResult = new int[2];
10+
private final Rect mRect = new Rect();
11+
12+
public boolean isViewBeingDragged(MotionEvent event, ScrollView view) {
13+
if (view.getChildCount() == 0) {
14+
return true;
15+
}
16+
17+
view.getLocationOnScreen(mViewLocationResult);
18+
final int viewLeft = mViewLocationResult[0], viewTop = mViewLocationResult[1];
19+
mRect.set(viewLeft, viewTop, viewLeft + view.getWidth(), viewTop + view.getHeight());
20+
final int rawX = (int) event.getRawX(), rawY = (int) event.getRawY();
21+
if (mRect.contains(rawX, rawY)) {
22+
return isReadyForPull(view, rawX - mRect.left, rawY - mRect.top);
23+
}
24+
25+
return false;
26+
}
27+
28+
@Override public boolean isReadyForPull(View view, float x, float y) {
29+
return view.getScrollY() <= 0;
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package me.relex.viewpagerheaderscrolldemo.fragment;
2+
3+
import android.app.Activity;
4+
import android.os.Bundle;
5+
import android.support.v4.app.Fragment;
6+
import me.relex.viewpagerheaderscrolldemo.tools.ScrollableFragmentListener;
7+
import me.relex.viewpagerheaderscrolldemo.tools.ScrollableListener;
8+
9+
public abstract class BaseViewPagerFragment extends Fragment implements ScrollableListener {
10+
11+
protected ScrollableFragmentListener mListener;
12+
protected static final String BUNDLE_FRAGMENT_INDEX = "BaseFragment.BUNDLE_FRAGMENT_INDEX";
13+
protected int mFragmentIndex;
14+
15+
@Override
16+
public void onCreate(Bundle savedInstanceState) {
17+
super.onCreate(savedInstanceState);
18+
Bundle bundle = getArguments();
19+
if (bundle != null) {
20+
mFragmentIndex = bundle.getInt(BUNDLE_FRAGMENT_INDEX, 0);
21+
}
22+
23+
if (mListener != null) {
24+
mListener.onFragmentAttached(this, mFragmentIndex);
25+
}
26+
}
27+
28+
@Override
29+
public void onAttach(Activity activity) {
30+
super.onAttach(activity);
31+
try {
32+
mListener = (ScrollableFragmentListener) activity;
33+
} catch (ClassCastException e) {
34+
throw new ClassCastException(
35+
activity.toString() + " must implement ScrollableFragmentListener");
36+
}
37+
}
38+
39+
@Override
40+
public void onDetach() {
41+
if (mListener != null) {
42+
mListener.onFragmentDetached(this, mFragmentIndex);
43+
}
44+
45+
super.onDetach();
46+
mListener = null;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
package me.relex.viewpagerheaderscrolldemo;
1+
package me.relex.viewpagerheaderscrolldemo.fragment;
22

3-
import android.app.Activity;
43
import android.os.Bundle;
5-
import android.support.v4.app.Fragment;
64
import android.view.LayoutInflater;
75
import android.view.MotionEvent;
86
import android.view.View;
@@ -12,44 +10,31 @@
1210
import android.widget.ArrayAdapter;
1311
import android.widget.ListAdapter;
1412
import android.widget.ListView;
15-
import android.widget.TextView;
13+
import me.relex.viewpagerheaderscrolldemo.R;
1614
import me.relex.viewpagerheaderscrolldemo.delegate.AbsListViewDelegate;
1715

18-
public class ItemFragment extends Fragment implements AbsListView.OnItemClickListener {
19-
20-
private OnFragmentInteractionListener mListener;
21-
22-
private static final String BUNDLE_FRAGMENT_INDEX = "ItemFragment.BUNDLE_FRAGMENT_INDEX";
23-
24-
private int mFragmentIndex;
16+
public class ListViewFragment extends BaseViewPagerFragment
17+
implements AbsListView.OnItemClickListener {
2518

2619
private ListView mListView;
2720
private ListAdapter mAdapter;
28-
2921
private AbsListViewDelegate mAbsListViewDelegate = new AbsListViewDelegate();
3022

31-
public static ItemFragment newInstance(int index) {
32-
ItemFragment fragment = new ItemFragment();
23+
public static ListViewFragment newInstance(int index) {
24+
ListViewFragment fragment = new ListViewFragment();
3325
Bundle args = new Bundle();
3426
args.putInt(BUNDLE_FRAGMENT_INDEX, index);
3527
fragment.setArguments(args);
3628
return fragment;
3729
}
3830

39-
public ItemFragment() {
31+
public ListViewFragment() {
4032
}
4133

4234
@Override
4335
public void onCreate(Bundle savedInstanceState) {
4436
super.onCreate(savedInstanceState);
45-
46-
Bundle bundle = getArguments();
47-
if (bundle != null) {
48-
mFragmentIndex = bundle.getInt(BUNDLE_FRAGMENT_INDEX, 0);
49-
}
50-
5137
String[] listArrays = null;
52-
5338
switch (mFragmentIndex) {
5439
case 1:
5540
listArrays = getResources().getStringArray(R.array.continents);
@@ -61,67 +46,26 @@ public void onCreate(Bundle savedInstanceState) {
6146
listArrays = getResources().getStringArray(R.array.countries);
6247
break;
6348
}
64-
6549
mAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1,
6650
android.R.id.text1, listArrays);
67-
68-
if (mListener != null) {
69-
mListener.onFragmentAttached(this, mFragmentIndex);
70-
}
7151
}
7252

7353
@Override
7454
public View onCreateView(LayoutInflater inflater, ViewGroup container,
7555
Bundle savedInstanceState) {
76-
View view = inflater.inflate(R.layout.fragment_item_list, container, false);
56+
View view = inflater.inflate(R.layout.fragment_list_view, container, false);
7757
mListView = (ListView) view.findViewById(android.R.id.list);
7858
mListView.setAdapter(mAdapter);
7959
mListView.setOnItemClickListener(this);
8060
mListView.setEmptyView(view.findViewById(android.R.id.empty));
81-
8261
return view;
8362
}
8463

85-
@Override
86-
public void onAttach(Activity activity) {
87-
super.onAttach(activity);
88-
try {
89-
mListener = (OnFragmentInteractionListener) activity;
90-
} catch (ClassCastException e) {
91-
throw new ClassCastException(
92-
activity.toString() + " must implement OnFragmentInteractionListener");
93-
}
94-
}
95-
96-
@Override
97-
public void onDetach() {
98-
if (mListener != null) {
99-
mListener.onFragmentDetached(this, mFragmentIndex);
100-
}
101-
102-
super.onDetach();
103-
mListener = null;
104-
}
105-
10664
@Override
10765
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
10866
}
10967

110-
public void setEmptyText(CharSequence emptyText) {
111-
View emptyView = mListView.getEmptyView();
112-
if (emptyView instanceof TextView) {
113-
((TextView) emptyView).setText(emptyText);
114-
}
115-
}
116-
117-
public interface OnFragmentInteractionListener {
118-
119-
public void onFragmentAttached(ItemFragment fragment, int position);
120-
121-
public void onFragmentDetached(ItemFragment fragment, int position);
122-
}
123-
124-
public boolean isViewBeingDragged(MotionEvent event) {
68+
@Override public boolean isViewBeingDragged(MotionEvent event) {
12569
return mAbsListViewDelegate.isViewBeingDragged(event, mListView);
12670
}
12771
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package me.relex.viewpagerheaderscrolldemo.fragment;
2+
3+
import android.os.Bundle;
4+
import android.view.LayoutInflater;
5+
import android.view.MotionEvent;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.ScrollView;
9+
import android.widget.TextView;
10+
import java.io.ByteArrayOutputStream;
11+
import java.io.Closeable;
12+
import java.io.InputStream;
13+
import me.relex.viewpagerheaderscrolldemo.R;
14+
import me.relex.viewpagerheaderscrolldemo.delegate.ScrollViewDelegate;
15+
16+
public class ScrollViewFragment extends BaseViewPagerFragment {
17+
18+
private ScrollView mScrollView;
19+
private ScrollViewDelegate mScrollViewDelegate = new ScrollViewDelegate();
20+
21+
public static ScrollViewFragment newInstance(int index) {
22+
ScrollViewFragment fragment = new ScrollViewFragment();
23+
Bundle args = new Bundle();
24+
args.putInt(BUNDLE_FRAGMENT_INDEX, index);
25+
fragment.setArguments(args);
26+
return fragment;
27+
}
28+
29+
@Override
30+
public View onCreateView(LayoutInflater inflater, ViewGroup container,
31+
Bundle savedInstanceState) {
32+
View view = inflater.inflate(R.layout.fragment_scroll_view, container, false);
33+
mScrollView = (ScrollView) view.findViewById(R.id.scrollview);
34+
TextView textView = (TextView) view.findViewById(R.id.text1);
35+
textView.setText(loadContentString());
36+
return view;
37+
}
38+
39+
@Override public boolean isViewBeingDragged(MotionEvent event) {
40+
return mScrollViewDelegate.isViewBeingDragged(event, mScrollView);
41+
}
42+
43+
private String loadContentString() {
44+
InputStream inputStream = null;
45+
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
46+
byte buf[] = new byte[8 * 1024];
47+
int len;
48+
String content = "";
49+
try {
50+
inputStream = getActivity().getAssets().open("lorem.txt");
51+
while ((len = inputStream.read(buf)) != -1) {
52+
outputStream.write(buf, 0, len);
53+
}
54+
content = outputStream.toString();
55+
} catch (Exception e) {
56+
e.printStackTrace();
57+
} finally {
58+
closeSilently(inputStream);
59+
closeSilently(outputStream);
60+
}
61+
62+
return content;
63+
}
64+
65+
public void closeSilently(Closeable c) {
66+
if (c == null) {
67+
return;
68+
}
69+
try {
70+
c.close();
71+
} catch (Throwable t) {
72+
// do nothing
73+
}
74+
}
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package me.relex.viewpagerheaderscrolldemo.tools;
2+
3+
public interface ScrollableFragmentListener {
4+
5+
public void onFragmentAttached(ScrollableListener fragment, int position);
6+
7+
public void onFragmentDetached(ScrollableListener fragment, int position);
8+
}

0 commit comments

Comments
 (0)