public class HomeScrollView extends ScrollView{
private int mode = 0;//当前scrollview处于的状态
private final int done = 0;//完成
private final int refreshing = 1;//刷新
private final int loading = 2;//加载
private int linHeight = 0;//临界值的高度
private int height = 0;//自身的高度,header或者footer的高度
private int maxHeight = 0;//最大的高度
PointF p=new PointF();
private Context context;
private LinearLayout mLayout;
private LinearLayout mContent;
private LinearLayout mHear;
private LinearLayout mfooter;
int rate=3;
private AnimationDrawable mfooterDrawable;
private AnimationDrawable mHearDrawable;
private float disY;
HomeRefreshCallBack homeRefreshCallBack;
private PointF m;
public void setHomeRefreshCallBack(HomeRefreshCallBack homeRefreshCallBack){
this.homeRefreshCallBack=homeRefreshCallBack;
}
public HomeScrollView(Context context) {
this(context,null);
}
public HomeScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
initView();
}
private void initView() {
mLayout = new LinearLayout(context);
mLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
mLayout.setOrientation(LinearLayout.VERTICAL);
mContent = new LinearLayout(context);
mContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
mContent.setOrientation(LinearLayout.HORIZONTAL);
mHear = (LinearLayout) View.inflate(context, R.layout.home_scrollview_hear, null);
mfooter = (LinearLayout) View.inflate(context, R.layout.home_scrollview_footer, null);
ImageView mHearIV = (ImageView) mHear.findViewById(R.id.home_scrollview_hear_iv);
mHearDrawable = (AnimationDrawable) mHearIV.getDrawable();
ImageView mfooterIV = (ImageView) mfooter.findViewById(R.id.home_scrollview_hear_iv);
mfooterDrawable = (AnimationDrawable) mfooterIV.getDrawable();
mLayout.addView(mHear);
mLayout.addView(mContent);
mLayout.addView(mfooter);
addView(mLayout);
linHeight=40;
maxHeight=100;
mHear.measure(0,0);
height=mHear.getMeasuredHeight();
selectMode();
}
public void setcontent(View content) {
content.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
mContent.addView(content);
}
private void selectMode() {
switch (mode){
case done:
if(mHearDrawable.isRunning()){
mHearDrawable.stop();
}
if(mfooterDrawable.isRunning()){
mfooterDrawable.stop();
}
mHear.setPadding(0,-height,0,0);
mfooter.setPadding(0,0,0,-height);
break;
case refreshing:
mHear.setPadding(0, 0, 0, 0);
mHearDrawable.start();
homeRefreshCallBack.refreshcallback();
break;
case loading:
mfooter.setPadding(0,0,0,0);
mfooterDrawable.start();
homeRefreshCallBack.loadcallback();
break;
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (homeRefreshCallBack==null)
return super.dispatchTouchEvent(ev);
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
p.y=ev.getY();
break;
case MotionEvent.ACTION_MOVE:
m = new PointF();
m.y=ev.getY();
disY = (m.y - p.y) / rate;
if(getScrollY()<=0&&disY>=0){
if(mode==done){
mHear.setPadding(0,(int)(disY-height),0,0);
if(disY-height>=linHeight){
mode=refreshing;
}else {
mode=done;
}
if(disY-height>=maxHeight){
mHear.setPadding(0,maxHeight,0,0);
}
return true;
}
}
if(getScrollY()+getHeight()>=computeVerticalScrollRange()&&disY<=0){
if(mode==done){
disY=Math.abs(disY);
mfooter.setPadding(0,0,0,(int)(disY-height));
if(disY-height>=linHeight){
mode=loading;
mfooter.setPadding(0,0,0,0);
}
if(disY-height>=maxHeight){
mfooter.setPadding(0,0,0,maxHeight);
}
return true;
}
}
break;
case MotionEvent.ACTION_UP:
if(!mHearDrawable.isRunning()&&!mfooterDrawable.isRunning()){
selectMode();
}
break;
}
return super.dispatchTouchEvent(ev);
}
public void refreshcompleted() {
mode=done;
selectMode();
}
public void measureListViewHeight(HomecategoryAdapter adapter, ListView listview) {
int listviewHeight=0;
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View view = adapter.getView(i, null, null);
view.measure(0, 0);
int measuredHeight = view.getMeasuredHeight();
listviewHeight+=measuredHeight;
}
listviewHeight+=listview.getDividerHeight()+listview.getPaddingTop()+listview.getPaddingBottom();
listview.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,listviewHeight));
listview.requestLayout();
}
}
public class SeeSeeFragment implements HomeRefreshCallBack {
int index=0;
private HomeScrollView scrollView;
private LinearLayout advertlinear;
private ListView listview;
private View con;
private FileSaveOrRead fileSaveOrRead;
private SeeSeeHandler homeHandler;
private BaseApplication baseApp;
private JsonUtil jsonUtil;
private HomeAdvert homeAdvert;
private Context context;
public SeeSeeFragment(FragmentActivity activity, int i) {
index=i;
this.context=activity;
baseApp = (BaseApplication)context.getApplicationContext();
fileSaveOrRead = new FileSaveOrRead(context);
homeHandler = new SeeSeeHandler(context);
jsonUtil = new JsonUtil();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(scrollView==null){
intiView();
}
return scrollView;
}
private void initListView() {
if (fileSaveOrRead.IsHave("data" + HttpHandler.SeeSeeSUCCESS + ".txt")) {
String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.SeeSeeSUCCESS + ".txt");
getAdertlast(readFile);
} else {
new HttpThread(context, homeHandler, baseApp.SEE1+index+baseApp.SEE2, "", HttpHandler.SeeSeeSUCCESS).start();
}
}
private void initAdvert() {
if (fileSaveOrRead.IsHave("data" + HttpHandler.ADDERTSUCCESS + ".txt")) {
String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.ADDERTSUCCESS + ".txt");
getAdertlast(readFile);
} else {
new HttpThread(context, homeHandler, BaseApplication.ADVERTURL, "", HttpHandler.ADDERTSUCCESS).start();
}
}
private void getAdertlast(String str) {
List<AdvertInfo> list=new JsonUtil().getadvert(str);
homeAdvert = new HomeAdvert(list,context);
RelativeLayout relativeLayout = homeAdvert.getrelative();
advertlinear.addView(relativeLayout);
homeAdvert.startthread();
}
private void intiView() {
scrollView = (HomeScrollView) View.inflate(context, R.layout.view_seeseeframent, null);
getContent();
scrollView.setcontent(con);
}
private void getContent() {
con = View.inflate(context, R.layout.seeseeframent_con1, null);
advertlinear = (LinearLayout) con.findViewById(R.id.seesee_con_advert);
listview = (ListView) con.findViewById(R.id.seesee_con_listview);
if(index==5||index==6){
advertlinear.setVisibility(View.GONE);
}
initAdvert();
initListView();
scrollView.setHomeRefreshCallBack(this);
}
@Override
public void refreshcallback() {
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
initListView();
scrollView.refreshcompleted();
}
},3000);
}
@Override
public void loadcallback() {
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.refreshcompleted();
}
}, 3000);
}
}
接口必须实现
public interface HomeRefreshCallBack {
void refreshcallback();
void loadcallback();
}
SeeSeeFragment的布局
<?xml version="1.0" encoding="utf-8"?>
<com.example.youhuo.myview.HomeScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/seeseeframent_srcollview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.example.youhuo.myview.HomeScrollView>
private int mode = 0;//当前scrollview处于的状态
private final int done = 0;//完成
private final int refreshing = 1;//刷新
private final int loading = 2;//加载
private int linHeight = 0;//临界值的高度
private int height = 0;//自身的高度,header或者footer的高度
private int maxHeight = 0;//最大的高度
PointF p=new PointF();
private Context context;
private LinearLayout mLayout;
private LinearLayout mContent;
private LinearLayout mHear;
private LinearLayout mfooter;
int rate=3;
private AnimationDrawable mfooterDrawable;
private AnimationDrawable mHearDrawable;
private float disY;
HomeRefreshCallBack homeRefreshCallBack;
private PointF m;
public void setHomeRefreshCallBack(HomeRefreshCallBack homeRefreshCallBack){
this.homeRefreshCallBack=homeRefreshCallBack;
}
public HomeScrollView(Context context) {
this(context,null);
}
public HomeScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
initView();
}
private void initView() {
mLayout = new LinearLayout(context);
mLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
mLayout.setOrientation(LinearLayout.VERTICAL);
mContent = new LinearLayout(context);
mContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
mContent.setOrientation(LinearLayout.HORIZONTAL);
mHear = (LinearLayout) View.inflate(context, R.layout.home_scrollview_hear, null);
mfooter = (LinearLayout) View.inflate(context, R.layout.home_scrollview_footer, null);
ImageView mHearIV = (ImageView) mHear.findViewById(R.id.home_scrollview_hear_iv);
mHearDrawable = (AnimationDrawable) mHearIV.getDrawable();
ImageView mfooterIV = (ImageView) mfooter.findViewById(R.id.home_scrollview_hear_iv);
mfooterDrawable = (AnimationDrawable) mfooterIV.getDrawable();
mLayout.addView(mHear);
mLayout.addView(mContent);
mLayout.addView(mfooter);
addView(mLayout);
linHeight=40;
maxHeight=100;
mHear.measure(0,0);
height=mHear.getMeasuredHeight();
selectMode();
}
public void setcontent(View content) {
content.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
mContent.addView(content);
}
private void selectMode() {
switch (mode){
case done:
if(mHearDrawable.isRunning()){
mHearDrawable.stop();
}
if(mfooterDrawable.isRunning()){
mfooterDrawable.stop();
}
mHear.setPadding(0,-height,0,0);
mfooter.setPadding(0,0,0,-height);
break;
case refreshing:
mHear.setPadding(0, 0, 0, 0);
mHearDrawable.start();
homeRefreshCallBack.refreshcallback();
break;
case loading:
mfooter.setPadding(0,0,0,0);
mfooterDrawable.start();
homeRefreshCallBack.loadcallback();
break;
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (homeRefreshCallBack==null)
return super.dispatchTouchEvent(ev);
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
p.y=ev.getY();
break;
case MotionEvent.ACTION_MOVE:
m = new PointF();
m.y=ev.getY();
disY = (m.y - p.y) / rate;
if(getScrollY()<=0&&disY>=0){
if(mode==done){
mHear.setPadding(0,(int)(disY-height),0,0);
if(disY-height>=linHeight){
mode=refreshing;
}else {
mode=done;
}
if(disY-height>=maxHeight){
mHear.setPadding(0,maxHeight,0,0);
}
return true;
}
}
if(getScrollY()+getHeight()>=computeVerticalScrollRange()&&disY<=0){
if(mode==done){
disY=Math.abs(disY);
mfooter.setPadding(0,0,0,(int)(disY-height));
if(disY-height>=linHeight){
mode=loading;
mfooter.setPadding(0,0,0,0);
}
if(disY-height>=maxHeight){
mfooter.setPadding(0,0,0,maxHeight);
}
return true;
}
}
break;
case MotionEvent.ACTION_UP:
if(!mHearDrawable.isRunning()&&!mfooterDrawable.isRunning()){
selectMode();
}
break;
}
return super.dispatchTouchEvent(ev);
}
public void refreshcompleted() {
mode=done;
selectMode();
}
public void measureListViewHeight(HomecategoryAdapter adapter, ListView listview) {
int listviewHeight=0;
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View view = adapter.getView(i, null, null);
view.measure(0, 0);
int measuredHeight = view.getMeasuredHeight();
listviewHeight+=measuredHeight;
}
listviewHeight+=listview.getDividerHeight()+listview.getPaddingTop()+listview.getPaddingBottom();
listview.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,listviewHeight));
listview.requestLayout();
}
}
public class SeeSeeFragment implements HomeRefreshCallBack {
int index=0;
private HomeScrollView scrollView;
private LinearLayout advertlinear;
private ListView listview;
private View con;
private FileSaveOrRead fileSaveOrRead;
private SeeSeeHandler homeHandler;
private BaseApplication baseApp;
private JsonUtil jsonUtil;
private HomeAdvert homeAdvert;
private Context context;
public SeeSeeFragment(FragmentActivity activity, int i) {
index=i;
this.context=activity;
baseApp = (BaseApplication)context.getApplicationContext();
fileSaveOrRead = new FileSaveOrRead(context);
homeHandler = new SeeSeeHandler(context);
jsonUtil = new JsonUtil();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(scrollView==null){
intiView();
}
return scrollView;
}
private void initListView() {
if (fileSaveOrRead.IsHave("data" + HttpHandler.SeeSeeSUCCESS + ".txt")) {
String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.SeeSeeSUCCESS + ".txt");
getAdertlast(readFile);
} else {
new HttpThread(context, homeHandler, baseApp.SEE1+index+baseApp.SEE2, "", HttpHandler.SeeSeeSUCCESS).start();
}
}
private void initAdvert() {
if (fileSaveOrRead.IsHave("data" + HttpHandler.ADDERTSUCCESS + ".txt")) {
String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.ADDERTSUCCESS + ".txt");
getAdertlast(readFile);
} else {
new HttpThread(context, homeHandler, BaseApplication.ADVERTURL, "", HttpHandler.ADDERTSUCCESS).start();
}
}
private void getAdertlast(String str) {
List<AdvertInfo> list=new JsonUtil().getadvert(str);
homeAdvert = new HomeAdvert(list,context);
RelativeLayout relativeLayout = homeAdvert.getrelative();
advertlinear.addView(relativeLayout);
homeAdvert.startthread();
}
private void intiView() {
scrollView = (HomeScrollView) View.inflate(context, R.layout.view_seeseeframent, null);
getContent();
scrollView.setcontent(con);
}
private void getContent() {
con = View.inflate(context, R.layout.seeseeframent_con1, null);
advertlinear = (LinearLayout) con.findViewById(R.id.seesee_con_advert);
listview = (ListView) con.findViewById(R.id.seesee_con_listview);
if(index==5||index==6){
advertlinear.setVisibility(View.GONE);
}
initAdvert();
initListView();
scrollView.setHomeRefreshCallBack(this);
}
@Override
public void refreshcallback() {
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
initListView();
scrollView.refreshcompleted();
}
},3000);
}
@Override
public void loadcallback() {
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.refreshcompleted();
}
}, 3000);
}
}
接口必须实现
public interface HomeRefreshCallBack {
void refreshcallback();
void loadcallback();
}
SeeSeeFragment的布局
<?xml version="1.0" encoding="utf-8"?>
<com.example.youhuo.myview.HomeScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/seeseeframent_srcollview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.example.youhuo.myview.HomeScrollView>