PullToRefreshScrollView+GridView,实现向下滑动中隐藏自定义Action布局

最近电商类项目有个需求挺头疼,要求用GridView去显示商品,滑动到底部下拉能加载更多商品,向下滑动过程中需要隐藏掉自定义的Action布局,向上滑动能显示出来,整体效果类似淘宝APP搜索结果页那样。

起初觉得挺简单的,但是后来才发现还是得转一点脑子。最开始我想用PullToRefreshGridView,但是后来发现GridView没有添加headview的方法,只能采用PullToRefreshScrollView内嵌套GridView的方法,Scrollview里多放一个空白布局当GridView的headview,高度和Action布局一样就行。这时还有一个问题,ScrollView和GridView会产生滑动冲突,还好网上很容易找到解决办法,我这里采用自定义GridView,最后就是监听方法了,最为关键的点,还是直接上代码吧:

自定义GridView:

package com.example.ztestscrollview;

import android.content.Context;

import android.util.AttributeSet;

import android.view.View.MeasureSpec;

import android.widget.GridView;

public class MyGridView extends GridView{

public MyGridView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyGridView(Context context) {

super(context);

}

public MyGridView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

主界面:

package com.example.ztestscrollview;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ScrollView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;

import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;

import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;

import com.handmark.pulltorefresh.library.PullToRefreshScrollView;

public class MainActivity extends Activity

{

int num = 10;

private GridAdapter adapter;

private ScrollView scrollView;

private PullToRefreshScrollView ptr_scrollview;

private View actionLayout;

private MyGridView myGridview;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

actionLayout = findViewById(R.id.actionlayout);

ptr_scrollview = (PullToRefreshScrollView) findViewById(R.id.ptr_scrollview);

ptr_scrollview.setMode(Mode.PULL_UP_TO_REFRESH);

ptr_scrollview.setOnRefreshListener(new OnRefreshListener<ScrollView>()

{

@Override

public void onRefresh(PullToRefreshBase<ScrollView> refreshView)

{

num += 10;

adapter.notifyDataSetChanged();

ptr_scrollview.onRefreshComplete();

}

});

myGridview = (MyGridView) findViewById(R.id.myGridView1);

adapter = new GridAdapter();

myGridview.setAdapter(adapter);

scrollView = ptr_scrollview.getRefreshableView();

scrollView.setOnTouchListener(new OnTouchListener()

{

// 判断是否第一个滑动值

boolean isFirst = true;

// Scrollview滑动的ScrollY值

private int ScrollY_Move;

// 第一个滑动的ScrollY值

private int First_ScrollY_Move;

// 手指抬起时ScrollY值

private int ScrollY_Up;

// ScrollY_Move和First_ScrollY_Move的差值

private int Cha;

@Override

public boolean onTouch(View v, MotionEvent event)

{

switch (event.getAction())

{

//ACTIN_DOWN没用,不用监听

case MotionEvent.ACTION_MOVE:

if (isFirst)

{

// 记录下第一个滑动的ScrollY值

First_ScrollY_Move = v.getScrollY();

isFirst = false;

}

// 记录下Scrollview滑动的ScrollY值

ScrollY_Move = v.getScrollY();

// 计算出ScrollY_Move和First_ScrollY_Move的差值

Cha = ScrollY_Move - First_ScrollY_Move;

// 当ScrollY_Move>First_ScrollY_Move时证明滑动方向是向下;

// 加上判断差值的目的:当Actionbar显示的时候,手指按住往下滑过一段距离还未抬起时,Actionbar也能隐藏

if (First_ScrollY_Move < ScrollY_Move || Cha > 200)

{

// 隐藏Actionbar

actionLayout.setVisibility(View.GONE);

}

// 当ScrollY_Move<First_ScrollY_Move时证明滑动方向是向上;

// 加上判断差值的目的:当Actionbar显示的时候,手指按住往上滑过一段距离还未抬起时,Actionbar也能显示

// 判断ScrollY_Move < 150目的:当Scrollview滑动接近顶端时必须显示Actionbar

else if (First_ScrollY_Move > ScrollY_Move || Cha < -200

|| ScrollY_Move < 150)

{

actionLayout.setVisibility(View.VISIBLE);

}

break;

case MotionEvent.ACTION_UP:

ScrollY_Up = v.getScrollY();// 记录下手指抬起时ScrollY值

isFirst = true;// 将isFirst还原为初始化

if (ScrollY_Up == 0)

{

actionLayout.setVisibility(View.VISIBLE);

}

// Log.e("ACTION_UP--->", "scrollY_up:" + scrollY_up + "   "

// + "eventY_up:" + eventY_up);

break;

default:

break;

}

return false;

}

});

}

class GridAdapter extends BaseAdapter

{

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

View inflate = getLayoutInflater().inflate(R.layout.griditem, null);

return inflate;

}

@Override

public int getCount()

{

// TODO Auto-generated method stub

return num;

}

@Override

public Object getItem(int position)

{

// TODO Auto-generated method stub

return null;

}

@Override

public long getItemId(int position)

{

// TODO Auto-generated method stub

return 0;

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<com.handmark.pulltorefresh.library.PullToRefreshScrollView

android:id="@+id/ptr_scrollview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true" >

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants" >

<RelativeLayout

android:id="@+id/headview"

android:layout_width="match_parent"

android:layout_height="120dp"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true" >

</RelativeLayout>

<com.example.ztestscrollview.MyGridView

android:id="@+id/myGridView1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_below="@+id/headview"

android:numColumns="2" >

</com.example.ztestscrollview.MyGridView>

</RelativeLayout>

</com.handmark.pulltorefresh.library.PullToRefreshScrollView>

<RelativeLayout

android:id="@+id/actionlayout"

android:layout_width="match_parent"

android:layout_height="120dp"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="#cdcdcd" >

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="ActionLayout" />

</RelativeLayout>

</RelativeLayout>

时间: 2024-08-07 04:31:47

PullToRefreshScrollView+GridView,实现向下滑动中隐藏自定义Action布局的相关文章

PullToRefreshScrollView实现顶层搜索框 滑动可隐藏 下面刷自定义GridView

最近项目里有个需求,要求用GridView去显示商品,滑动到底部下拉能加载更多商品,向下滑动过程中需要隐藏掉自定义的Action(搜索框)布局,向上滑动能显示出来,整体效果类似淘宝APP搜索结果页那样. 起初觉得挺简单的,但是后来才发现还是得转一点脑子.最开始我想用PullToRefreshGridView,但是后来发现GridView没有添加headview的方法,只能采用PullToRefreshScrollView内嵌套GridView的方法,Scrollview里多放一个空白布局当Gri

[ jquery 效果 slideDown([speed,[easing],[fn]]) slideUp([speed,[easing],[fn]]) ] 此方法用于滑动显示隐藏的被选元素:动画效果只调整元素的高度,可以使匹配的元素以“滑动”的方式显示出来。在jQuery 1.3中,上下的padding和margin也会被有动画,效果更流畅

此方法用于滑动显示隐藏的被选元素:动画效果只调整元素的高度,可以使匹配的元素以“滑动”的方式显示出来.在jQuery 1.3中,上下的padding和margin也会被有动画,效果更流畅 实例: <!DOCTYPE html><html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my

一起学android之解决在scrollview中嵌套ListView切换界面时scrollview整体向下滑动(31)

有时候我们在scrollview中会嵌套ListView,在嵌套ListView(ListView上面还有一些控件)后,切换Activity时会发现整个 scrollview 想下滑动直到ListView置顶了,而上面的控件无法显示时,我们可以这样做: 将图中的View放在顶部,最后在代码中这样做: view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); 通过setFocusable和se

JQ 移动端返回顶部,往下滑动时显示返回按钮,往上滑动时隐藏返回按钮

returnTop:function(){ //预定义返回顶部的html代码,它的css样式默认为不显示 var gotoTop_html = '<div class="returnTop"></div>'; //将返回顶部的html代码插入页面上id为page的元素的末尾 $(".ding_C_returnTop").append(gotoTop_html); var windowTop=0;//初始话可视区域距离页面顶端的距离 $(doc

Android中隐藏顶部状态栏的那些坑

Android中隐藏顶部状态栏的那些坑 先看看常规的隐藏状态栏的方法: 方法一: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除title requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉Activity上面的状态栏 getWindow().setFlags(WindowManager

在一张图片中隐藏另一张图片

首先是在灰度图中隐藏灰度图 因为是交作业嘛,为了简单就依次在每个字节中隐藏信息,如果有什么不想让人看见的东西要隐藏,可以自己有选择性的隐藏 这里先得到两张灰度图 将第二幅图片当作秘密图片插入一图,这里先将第二幅图置乱 这里采用的是菱形置乱的方法,即在菱形中从第一行开始从左向右依次写入1到n,替换时从第一列从上到下依次读取序号,即第一列序号对应的像素作为第一个像素 代码如下,这里我用的算法比较笨就将就吧,恢复置乱时只需要更改其中一条代码,在代码中已说明 再说明一下,我是将菱形补全为正方形,用0填充

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

关于CSS中隐藏内容方法的思考

正在读<精通CSS>,很多样式需要用到内容隐藏,比如平时无内容,鼠标悬停时显示出内容.书中常用的方法是用text-indent:-1000em.margin-left:-1000em将元素隐藏到屏幕边缘之外,而display:none和visibility:hidden.overflow:hidden也可以做到隐藏,那么这几种用法有哪些利弊呢? 1.display:none; 搜索引擎可能认为被隐藏的元素属于垃圾信息而忽略,不利于SEO:屏幕阅读器会忽略被隐藏的元素. 2.visibility

iOS7下滑动返回与ScrollView共存二三事

[转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用,可以替换interactivePopGestureRecognizer的delegate以统一管理应用中所有页面滑动返回的开关,比如在UINavigationController的派生类中 1 //我是一个NavigationController的派生类 2 - (id)initWithRootV