在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android仿美团界面源码(无业务逻辑)

android仿美团界面源码(无业务逻辑)

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:7.81M
  • 下载次数:65
  • 浏览次数:2839
  • 发布时间:2015-08-17
  • 实例类别:Android平台开发
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Android 源码 d

实例介绍

【实例简介】

【实例截图】

【核心代码】

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);
		}

	}

}

标签: Android 源码 d

实例下载地址

android仿美团界面源码(无业务逻辑)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警