实例介绍
【实例简介】
【实例截图】


【核心代码】
package com.xiang.tuanshopping.activity;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.xiang.tuanshopping.R;
import com.xiang.tuanshopping.adapter.ImageListAdapter;
import com.xiang.tuanshopping.adapter.TypeAdapter;
import com.xiang.tuanshopping.application.DataApplication;
import com.xiang.tuanshopping.bean.Merchs;
import com.xiang.tuanshopping.bean.Page;
import com.xiang.tuanshopping.util.PullToRefreshView;
import com.xiang.tuanshopping.util.PullToRefreshView.OnFooterRefreshListener;
import com.xiang.tuanshopping.util.PullToRefreshView.OnHeaderRefreshListener;
import com.xiang.tuanshopping.util.TuanJsonParser;
import com.xiang.tuanshopping.util.Utility;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.OnHierarchyChangeListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.view.ViewGroup.LayoutParams;
public class TuangouActivity extends Activity {
private long exitTime = 0;
private GridView gv_type;
private ArrayList<Integer> types;
private TypeAdapter typeAdapter;
private static final int MESSAGE_INIT_DATA_SUCCESS = 1;
// 美团开放API接口
private final String URI = "";
private ImageView iv_map;
private ImageView iv_search;
private DataApplication dataApp = null;
// 商品信息
private List<Merchs> merchsList = null;
// 商品信息适配器
private ImageListAdapter merchAdapter = null;
// 请求数据地址
public static final String path = "http://192.168.2.99:8080/TuanShoppingServer/mypack/merchsAction_getAllMerchsList";
private TextView tv_merchs_info;
private ListView lv_like_shop;
private LayoutInflater inflater;
private int headerHeight; // 头高度
private int lastHeaderPadding; // 最后一次调用Move Header的Padding
private boolean isBack; // 从Release 转到 pull
private int headerState = DONE; // 头部状态
static final private int RELEASE_To_REFRESH = 0; // 释放刷新:一直下拉屏幕时显示
static final private int PULL_To_REFRESH = 1; // 正在刷新:放开屏幕后显示
static final private int REFRESHING = 2; // 正在刷新
static final private int DONE = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
initView();// 初始化各控件
initCategory();// 初始化分类
setListener();//给控件设置监听
// 开启线程查询数据
new Thread(new InitDataTask()).start();
}
private Handler handler = new Handler() {
public void dispatchMessage(android.os.Message msg) {
switch (msg.what) {
// 初始化数据成功
case MESSAGE_INIT_DATA_SUCCESS:
// 绑定数据到适配器
merchAdapter = new ImageListAdapter(TuangouActivity.this,
merchsList);
lv_like_shop.setAdapter(merchAdapter);
// 加载完成,隐藏加载动画
tv_merchs_info.setVisibility(View.GONE);
Utility.setListViewHeightBasedOnChildren(lv_like_shop);
break;
}
};
};
private ScrollView sc;
private LinearLayout globleLayout;
private LinearLayout header;
private Animation anim;
private ImageView iv_anim_first;
private ImageView iv_header_fresh_anim;
private TextView tv_text;
private AnimationDrawable ad;
/**
* 初始化各控件
*/
public void initView() {
// 给头部导航的ImageView设置点击事件监听
iv_map = (ImageView) findViewById(R.id.iv_map);
iv_search = (ImageView)findViewById(R.id.iv_search);
// 初始化中间商品信息控件
tv_merchs_info = (TextView) findViewById(R.id.tv_load_info);
lv_like_shop = (ListView) findViewById(R.id.lv_like_shop);
// ScrollView
sc = (ScrollView) findViewById(R.id.sv_first_sc);
// 整体布局
globleLayout = (LinearLayout) findViewById(R.id.globleLayout);
// 布局加载器
inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 头部布局
header = (LinearLayout) inflater.inflate(R.layout.first_header, null);
tv_text = (TextView) header.findViewById(R.id.tv_first_refresh_text);
iv_header_fresh_anim = (ImageView) header
.findViewById(R.id.iv_header_anim);
iv_header_fresh_anim.setBackgroundResource(R.drawable.frame);
ad = (AnimationDrawable) iv_header_fresh_anim.getBackground();
// 头部动画
anim = AnimationUtils.loadAnimation(this, R.anim.rotate);
// 动画应用到的控件
iv_anim_first = (ImageView) header.findViewById(R.id.iv_first_refresh);
// 计算头部高度
measureView(header);
headerHeight = header.getMeasuredHeight();
lastHeaderPadding = (-1 * headerHeight);
header.setPadding(10, lastHeaderPadding, 0, 20);
header.invalidate();
// 添加头部布局
globleLayout.addView(header, 0);
anim.setFillAfter(true);// 动画结束后保持动画
// 为ScrollView绑定监听
sc.setOnTouchListener(new OnTouchListener() {
private int beginY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
/**
* sc.getScrollY == 0 scrollview 滑动到头了 lastHeaderPadding >
* (-1*headerHeight) 表示header还没完全隐藏起来时 headerState !=
* REFRESHING正在刷新时
*/
if ((sc.getScrollY() == 0 || lastHeaderPadding > (-1 * headerHeight))
&& headerState != REFRESHING) {
// 拿到滑动的Y轴距离
int interval = (int) (event.getY() - beginY);
// 是向下滑动而不是向上滑动
if (interval > 0) {
interval = interval / 2;// 下滑阻力
lastHeaderPadding = interval (-1 * headerHeight);
header.setPadding(10, lastHeaderPadding, 0, 20);
if (lastHeaderPadding > 0) {
// txView.setText("我要刷新咯");
headerState = RELEASE_To_REFRESH;
// 是否已经更新了UI
if (!isBack) {
isBack = true; // 到了Release状态,如果往回滑动到了pull则启动动画
changeHeaderViewByState();
}
} else {
headerState = PULL_To_REFRESH;
changeHeaderViewByState();
// txView.setText("看到我了哦");
// sc.scrollTo(0, headerPadding);
}
}
}
break;
case MotionEvent.ACTION_DOWN:
// 加上下滑阻力与实际滑动距离的差(大概值)
beginY = (int) ((int) event.getY() sc.getScrollY() * 1.5);
break;
case MotionEvent.ACTION_UP:
if (headerState != REFRESHING) {
switch (headerState) {
case DONE:
// 什么也不干
break;
case PULL_To_REFRESH:
headerState = DONE;
lastHeaderPadding = -1 * headerHeight;
header.setPadding(10, lastHeaderPadding, 0, 0);
changeHeaderViewByState();
break;
case RELEASE_To_REFRESH:
isBack = false; // 准备开始刷新,此时将不会往回滑动
headerState = REFRESHING;
changeHeaderViewByState();
onRefresh();
break;
default:
break;
}
}
break;
}
// 如果Header是完全被隐藏的则让ScrollView正常滑动,让事件继续否则的话就阻断事件
if (lastHeaderPadding > (-1 * headerHeight)
&& headerState != REFRESHING) {
return true;
} else {
return false;
}
}
});
}
private void onRefresh() {
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
onRefreshComplete();
}
}.execute(null);
}
public void onRefreshComplete() {
headerState = DONE;
changeHeaderViewByState();
}
/**
* 初始化分类
*/
public void initCategory() {
gv_type = (GridView) findViewById(R.id.gv_type);
types = new ArrayList<Integer>();
types.add(R.drawable.ic_category_0);
types.add(R.drawable.ic_category_1);
types.add(R.drawable.ic_category_2);
types.add(R.drawable.ic_category_3);
types.add(R.drawable.ic_category_4);
types.add(R.drawable.ic_category_5);
types.add(R.drawable.ic_category_6);
types.add(R.drawable.ic_category_7);
typeAdapter = new TypeAdapter(types, this);
gv_type.setAdapter(typeAdapter);
gv_type.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position) {
case 0:
Intent food = new Intent(TuangouActivity.this,
FoodActivity.class);
startActivity(food);
break;
case 1:
Intent movie = new Intent(TuangouActivity.this,
MovieActivity.class);
startActivity(movie);
break;
case 2:
Intent hotel = new Intent(TuangouActivity.this,
HotelActivity.class);
startActivity(hotel);
break;
case 3:
Intent ktv = new Intent(TuangouActivity.this,
KtvActivity.class);
startActivity(ktv);
break;
case 4:
Intent health = new Intent(TuangouActivity.this,
HealthActivity.class);
startActivity(health);
break;
case 5:
Intent amusement = new Intent(TuangouActivity.this,
AmusementActivity.class);
startActivity(amusement);
break;
case 6:
Intent today = new Intent(TuangouActivity.this,
TodayActivity.class);
startActivity(today);
break;
case 7:
Intent all = new Intent(TuangouActivity.this,
AllActivity.class);
startActivity(all);
break;
default:
break;
}
}
});
}
/**
* 多线程查询商品数据
*/
class InitDataTask implements Runnable {
@Override
public void run() {
// merchsList = new ArrayList<Merchs>();
Log.d("geek", "开启线程");
// 加载数据:接受服务端的数据
merchsList = TuanJsonParser.parse(TuangouActivity.path);
Log.d("geek", "大小:" merchsList.size());
// 查询完了将数据给适配器
handler.sendEmptyMessage(MESSAGE_INIT_DATA_SUCCESS);
}
}
/**
* 各控件的监听
*/
public void setListener() {
iv_map.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
iv_map.setBackgroundColor(getResources().getColor(
R.color.abs__background_holo_light));
Intent intent = new Intent(TuangouActivity.this,
MapActivity.class);
startActivity(intent);
}
});
iv_search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
/**
* 拿到头部高度,onCreate里面得不到
*/
private void measureView(View childView) {
LayoutParams p = childView.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 0, p.width);
int height = p.height;
int childHeightSpec;
if (height > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(height,
MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
childView.measure(childWidthSpec, childHeightSpec);
}
/**
* 通过状态来改变头部视图
*/
private void changeHeaderViewByState() {
switch (headerState) {
case PULL_To_REFRESH:
// 是由RELEASE_To_REFRESH状态转变来的
if (isBack) { // 向上送
isBack = false;
// 开启动画
iv_anim_first.startAnimation(anim);
ad.start();
tv_text.setText("下拉刷新");
}
tv_text.setText("下拉刷新");
break;
case RELEASE_To_REFRESH: // 向下拖:这里只有右边的进度动画
iv_anim_first.setVisibility(View.VISIBLE);
iv_header_fresh_anim.setVisibility(View.VISIBLE);
tv_text.setVisibility(View.VISIBLE);
iv_anim_first.startAnimation(anim); // 右边的进度动画
tv_text.setText("松手刷新");
break;
case REFRESHING:
lastHeaderPadding = 0;
header.setPadding(10, lastHeaderPadding, 0, 20);
header.invalidate();
iv_header_fresh_anim.setVisibility(View.VISIBLE);
iv_anim_first.setVisibility(View.VISIBLE);
tv_text.setText("载入中...");
ad.start();
break;
case DONE: // 向上送
lastHeaderPadding = -1 * headerHeight;
header.setPadding(10, lastHeaderPadding, 0, 20);
header.invalidate();
iv_header_fresh_anim.setVisibility(View.GONE);
tv_text.setText("下拉刷新");
break;
default:
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论