/** * */ package com.keju.maomao.activity.bar; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.Timer; import java.util.TimerTask; import android.app.ProgressDialog; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.ProgressBar; import android.widget.TextView; import com.keju.maomao.AsyncImageLoader; import com.keju.maomao.AsyncImageLoader.ImageCallback; import com.keju.maomao.CommonApplication; import com.keju.maomao.Constants; import com.keju.maomao.R; import com.keju.maomao.SystemException; import com.keju.maomao.activity.base.BaseActivity; import com.keju.maomao.bean.BarBean; import com.keju.maomao.bean.BarTypeBean; import com.keju.maomao.bean.ResponseBean; import com.keju.maomao.helper.BusinessHelper; import com.keju.maomao.imagecache.ImageCache; import com.keju.maomao.imagecache.ImageCache.ImageCacheParams; import com.keju.maomao.imagecache.ImageFetcher; import com.keju.maomao.util.AndroidUtil; import com.keju.maomao.util.ImageUtil; import com.keju.maomao.util.NetUtil; import com.keju.maomao.util.SharedPrefUtil; import com.keju.maomao.util.StringUtil; import com.keju.maomao.view.azzviewpager.JazzyViewPager; import com.keju.maomao.view.azzviewpager.JazzyViewPager.TransitionEffect; import com.keju.maomao.view.azzviewpager.OutlineContainer; /** * 酒吧列表 * * @author zhouyong * @data 创建时间:2013-10-21 下午10:47:28 */ public class BarListActivity extends BaseActivity implements OnClickListener { private ImageButton ibLeft; private Button btnRight; private TextView tvTitle; private View llCommon; private ListView lvBarList; private Adapter adapter; private ArrayList<BarBean> barList; private List<BarBean> hotList = new ArrayList<BarBean>();// 热门推荐酒吧 private List<BarBean> ScreenAreaList;// 地区 private JazzyViewPager viewPage;// 推荐酒吧滚动控件 private MyPagerAdapter barAdapter; private ArrayList<View> views = new ArrayList<View>(); private LinearLayout viewMenuList;// 原点 private int currPosition = 0;// 当前位置 private View viewBanner; private ImageView ivBanner; private Handler iHandler; private TimerTask timerTask; private Timer timer; private static final int HANDLE_TYPE_RUN = 1; private ImageFetcher mImageFetcher; private int screenWidth;// 屏幕宽度 private int count = 0; private int pageIndex = 1; private View vFooter; private ProgressBar pbFooter; private TextView tvFooterMore; private boolean isFilter = false;// 是否为筛选 private boolean isLoad = false;// 是否正在加载数据 private boolean isLoadMore = false; private boolean isComplete = false;// 是否加载完了; private boolean isFirst = true;// 是否第一次进该界面 private BarTypeBean bean; private ProgressDialog pd; private CommonApplication app; private TextView tvNearbyBar;// 附近酒啊 private int provinceId; private int cityId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bar_list); app = (CommonApplication) getApplication(); bean = (BarTypeBean) getIntent().getExtras().getSerializable(Constants.EXTRA_DATA); if ((int) getIntent().getExtras().getInt("PROVINCEID") == 0) { if (SharedPrefUtil.getProvinceId(BarListActivity.this) == 0) { showShortToast("没有定位到当前城市,请到首页切换相应的城市"); } else { provinceId = SharedPrefUtil.getProvinceId(BarListActivity.this); } } else { provinceId = (int) getIntent().getExtras().getInt("PROVINCEID"); } findView(); fillData(); screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();// 获取图片宽度 ImageCacheParams cacheParams = new ImageCacheParams(this, Constants.APP_DIR_NAME); cacheParams.memoryCacheEnabled = false; cacheParams.compressQuality = 60; mImageFetcher = new ImageFetcher(this, (int) ((screenWidth + 100) * AndroidUtil.getDensity(this))); mImageFetcher.addImageCache(cacheParams); app.addActivity(this); } private void findView() { ibLeft = (ImageButton) this.findViewById(R.id.ibLeft); btnRight = (Button) this.findViewById(R.id.btnRight); llCommon = findViewById(R.id.llCommon); lvBarList = (ListView) this.findViewById(R.id.lvBarList); viewPage = (JazzyViewPager) this.findViewById(R.id.viewPage); tvTitle = (TextView) this.findViewById(R.id.tvTitle); tvTitle.setText(bean.getName()); tvTitle.setOnClickListener(this); // 加载更多footer vFooter = getLayoutInflater().inflate(R.layout.footer, null); pbFooter = (ProgressBar) vFooter.findViewById(R.id.progressBar); tvFooterMore = (TextView) vFooter.findViewById(R.id.tvMore); viewMenuList = (LinearLayout) this.findViewById(R.id.viewMenuList); tvNearbyBar = (TextView) this.findViewById(R.id.tvNearbyBar); } private void fillData() { ibLeft.setOnClickListener(this); ibLeft.setImageResource(R.drawable.ic_btn_left); btnRight.setOnClickListener(this); btnRight.setBackgroundResource(R.drawable.bg_btn_collection); btnRight.setText("搜索"); tvNearbyBar.setOnClickListener(this); barList = new ArrayList<BarBean>(); adapter = new Adapter(); lvBarList.addFooterView(vFooter); lvBarList.setAdapter(adapter); lvBarList.setOnScrollListener(LoadListener); lvBarList.setOnItemClickListener(itemListener); lvBarList.setDivider(null); lvBarList.setFooterDividersEnabled(false); ScreenAreaList = new ArrayList<BarBean>();// 地区 ScreenAreaList.add(new BarBean(0, "全部地区")); initMessageHandler(); if (NetUtil.checkNet(BarListActivity.this)) { new GetBarListTask().execute(); app.initBMapInfo(); } else { showShortToast(R.string.NoSignalException); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ibLeft: finish(); break; case R.id.btnRight: openActivity(SearchActivity.class); break; case R.id.tvTitle: showScreenAreaPopuWindow(); break; case R.id.tvNearbyBar: openActivity(NearbyBarListActivity.class); break; default: break; } } /** * listview点击事件 */ OnItemClickListener itemListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (arg2 >= barList.size()) { return; } BarBean bean = barList.get(arg2); Bundle b = new Bundle(); b.putSerializable(Constants.EXTRA_DATA, bean); openActivity(BarDetailActivity.class, b); } }; /** * 滚动监听器 */ OnScrollListener LoadListener = new OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { isLoadMore = true; } else { isLoadMore = false; } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 滚动到最后,默认加载下一页 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && isLoadMore) { if (NetUtil.checkNet(BarListActivity.this)) { if (!isLoad && !isComplete) { new GetBarListTask().execute(); } } else { showShortToast(R.string.NoSignalException); } } else { } } }; /** * 显示筛选地区 使用的方法是PopuWindow * */ private PopupWindow pw; private int displayHeight; private ListView lvScreenArea; private ScreenAreaAdapter screenAdapter; private void showScreenAreaPopuWindow() { tvTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.ic_filter_up_arrow), null); displayHeight = (BarListActivity.this).getWindowManager().getDefaultDisplay().getHeight(); int maxHeight = (int) (displayHeight * 0.8); View view = LayoutInflater.from(this).inflate(R.layout.popu_data_picker_list, null); lvScreenArea = (ListView) view.findViewById(R.id.lvScreenArea); LayoutParams p = new LayoutParams(LayoutParams.MATCH_PARENT, maxHeight); view.setLayoutParams(p); LinearLayout layout = new LinearLayout(this); layout.addView(view, p); pw = new PopupWindow(layout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); pw.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_date_picker)); pw.setAnimationStyle(R.style.PopupWindowAnimation); pw.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_lightransparent)); // 设置焦点,必须设置,否则listView无法响应 pw.setFocusable(true); // 设置点击其他地方 popupWindow消失 pw.setOutsideTouchable(true); // pw.showAsDropDown(btnLeft); pw.showAsDropDown(llCommon); screenAdapter = new ScreenAreaAdapter(); lvScreenArea.setAdapter(screenAdapter); lvScreenArea.addFooterView(vFooter); lvScreenArea.setDivider(null); lvScreenArea.setOnItemClickListener(ItemListener1); layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onPressBack(); } }); } /** * 如果菜单成展开状态,则让菜单收回去 */ public boolean onPressBack() { if (pw != null && pw.isShowing()) { pw.dismiss(); tvTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.ic_filter_down_arrow), null); return true; } else { return false; } } public void onBackPressed() { if (!onPressBack()) { finish(); } }; /** * 筛选地区点击 listview点击事件 */ OnItemClickListener ItemListener1 = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (arg2 >= ScreenAreaList.size()) { return; } if (arg2 == 0) { pageIndex = 1; if (NetUtil.checkNet(BarListActivity.this)) { isFilter = true; cityId = 0; new GetBarListTask().execute(); } else { showShortToast(R.string.NoSignalException); } } else { BarBean bean1 = ScreenAreaList.get(arg2); pageIndex = 1; if (NetUtil.checkNet(BarListActivity.this)) { isFilter = true; cityId =bean1.getCityId(); new GetBarListTask().execute(); } else { showShortToast(R.string.NoSignalException); } } onPressBack(); } }; /** * * 筛选地区适配器 * * */ private class ScreenAreaAdapter extends BaseAdapter { @Override public int getCount() { return ScreenAreaList.size(); } @Override public Object getItem(int position) { return screenAdapter.getItem(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { BarBean bean = ScreenAreaList.get(position); ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = getLayoutInflater().inflate(R.layout.popu_data_picker_item, null); holder.tvScreenArea = (TextView) convertView.findViewById(R.id.tvScreenArea); holder.creenArealine = (View) convertView.findViewById(R.id.creenArealine); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position == 0) { holder.tvScreenArea.setTextColor(getResources().getColor(R.color.blue)); holder.creenArealine.setBackgroundResource(R.drawable.bg_bar_details_line1); } else { holder.tvScreenArea.setTextColor(getResources().getColor(R.color.black)); holder.creenArealine.setBackgroundResource(R.drawable.bg_bar_details_line); } holder.tvScreenArea.setText(bean.getScreenAreaName()); return convertView; } class ViewHolder { private TextView tvScreenArea; private View creenArealine; } } /** * 获取酒吧列表 * */ public class GetBarListTask extends AsyncTask<Void, Void, ResponseBean<BarBean>> { // private int cityId; /** * @param pageIndex * @param i * @param cityid */ // public GetBarListTask() { // // } // // public GetBarListTask(int cityId) { // this.cityId = cityId; // // } @Override protected void onPreExecute() { super.onPreExecute(); if (isLoadMore) { isLoad = true; pbFooter.setVisibility(View.VISIBLE); tvFooterMore.setText(R.string.loading); } else { if (pd == null) { pd = new ProgressDialog(BarListActivity.this); } pd.setMessage(getString(R.string.loading)); pd.show(); } } @Override protected ResponseBean<BarBean> doInBackground(Void... params) { try { return new BusinessHelper().getBarList(bean.getId(), provinceId, cityId, pageIndex); } catch (SystemException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(ResponseBean<BarBean> result) { super.onPostExecute(result); if (pd != null) { pd.dismiss(); } pbFooter.setVisibility(View.GONE); if (isFilter) { barList.clear(); // 就是如果是筛选 就清除listview数据 } if (result.getStatus() != Constants.REQUEST_FAILD) { List<BarBean> tempList = result.getObjList(); if (pageIndex == 1) { hotList.addAll(result.getObjList1()); if (isFilter) {// 根据用户的需求再定吧 } else { fillTodayRecommend(result.getObjList1()); } if (isFirst) { ScreenAreaList.addAll(result.getObjList2()); } } boolean isLastPage = false; if (tempList.size() > 0) { barList.addAll(tempList); adapter.notifyDataSetChanged(); // 通知更新 pageIndex++; } else { showShortToast("该地区无相应的酒吧"); isLastPage = true; } if (isLastPage) { pbFooter.setVisibility(View.GONE); tvFooterMore.setText(R.string.load_all); isComplete = true; } else { if (tempList.size() > 0 && tempList.size() < Constants.PAGE_SIZE) { pbFooter.setVisibility(View.GONE); tvFooterMore.setText(R.string.load_all); isComplete = true; } else { pbFooter.setVisibility(View.GONE); tvFooterMore.setText("上拉查看更多"); isComplete = false; } } if (pageIndex == 1 && tempList.size() == 0) { tvFooterMore.setText(""); } } else { showShortToast(result.getError()); tvFooterMore.setText(""); } if (isFilter) { // isComplete = false; } adapter.notifyDataSetChanged(); isLoad = false; isFilter = false; isFirst = false; } } /** * 填充今日推荐数据 * * @param list */ private void fillTodayRecommend(final List<BarBean> hotlist) { if (hotlist.size() <= 0) { return; } views.clear(); viewMenuList.removeAllViews(); count = hotlist.size(); for (int i = 0; i < hotlist.size(); i++) { final BarBean bean = hotlist.get(i); viewBanner = getLayoutInflater().inflate(R.layout.today_commened_item, null); ivBanner = (ImageView) viewBanner.findViewById(R.id.ivBannerImage); String picUrl = bean.getRecommendImageUrl(); final int viewPagerHeight = viewPage.getHeight(); ImageUtil.resetViewSize(ivBanner, screenWidth, viewPagerHeight); if (mImageFetcher != null) { mImageFetcher.loadImage(picUrl, ivBanner); } ivBanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle b = new Bundle(); b.putSerializable(Constants.EXTRA_DATA, bean); openActivity(BarDetailActivity.class, b); } }); views.add(viewBanner); ImageView iviewMenuList = new ImageView(this);// 原点设置 LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1.0f); params.leftMargin = 2; params.rightMargin = 2; iviewMenuList.setLayoutParams(params); if (i == 0) { iviewMenuList.setBackgroundResource(R.drawable.ic_pager_sel); } else { iviewMenuList.setBackgroundResource(R.drawable.ic_pager_nor); } viewMenuList.addView(iviewMenuList, i); if (count == 1) { viewMenuList.setVisibility(View.GONE); } else { viewMenuList.setVisibility(View.VISIBLE); } } viewPage.setTransitionEffect(TransitionEffect.CubeOut); viewPage.setCurrentItem(0); barAdapter = new MyPagerAdapter(views); viewPage.setAdapter(barAdapter); viewPage.setOnPageChangeListener(new MyPageChangeListener()); startTask(); } /** * 改变原点的状态 * * @param position */ private void changeState(int position) { int pos = position % count; int count = viewMenuList.getChildCount(); for (int i = 0; i < count; i++) { ImageView ivItem = (ImageView) viewMenuList.getChildAt(i); if (i == pos) { ivItem.setBackgroundResource(R.drawable.ic_pager_sel); } else { ivItem.setBackgroundResource(R.drawable.ic_pager_nor); } } } private void startTask() { if (timerTask == null) { timerTask = new TimerTask() { @Override public void run() { Message msg = new Message(); msg.what = HANDLE_TYPE_RUN; iHandler.sendMessage(msg); } }; timer = new Timer(); timer.schedule(timerTask, 0, 5000); } } private void closeTimer() { if (timer != null) { timer.cancel(); timer = null; } if (timerTask != null) { timerTask = null; } } private void initMessageHandler() { iHandler = new Handler() { @Override public void handleMessage(Message msg) { int what = msg.what; switch (what) { case HANDLE_TYPE_RUN: if (++currPosition == count) { currPosition = 0; } viewPage.setCurrentItem(currPosition); break; default: break; } super.handleMessage(msg); } }; } @Override public void onPause() { super.onPause(); closeTimer(); mImageFetcher.setExitTasksEarly(true); mImageFetcher.flushCache(); } @Override public void onDestroy() { super.onDestroy(); ImageCache mImageCache = mImageFetcher.getImageCache(); if (mImageCache != null) { mImageCache.clearCache(); mImageCache.close(); mImageCache = null; } mImageFetcher.closeCache(); mImageFetcher.clearCache(); mImageFetcher = null; } @Override protected void onResume() { super.onResume(); mImageFetcher.setExitTasksEarly(false); if (count > 1) { startTask(); } } /** * 适配器 * **/ public class Adapter extends BaseAdapter { @Override public int getCount() { return barList.size(); } @Override public Object getItem(int position) { return barList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; BarBean bean = barList.get(position); if (convertView == null) { holder = new ViewHolder(); convertView = getLayoutInflater().inflate(R.layout.bar_item, null); holder.tvBarName = (TextView) convertView.findViewById(R.id.tvBarName); holder.tvAddress = (TextView) convertView.findViewById(R.id.tvAddress); holder.tvDistanceLabel = (TextView) convertView.findViewById(R.id.tvDistanceLabel); holder.tvContent = (TextView) convertView.findViewById(R.id.tvcontent); holder.ivImage = (ImageView) convertView.findViewById(R.id.ivImage); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String url = bean.getImageUrl(); holder.ivImage.setTag(url); Drawable cacheDrawble = AsyncImageLoader.getInstance().loadDrawable(url, new ImageCallback() { @Override public void imageLoaded(Drawable imageDrawable, String imageUrl) { ImageView image = (ImageView) lvBarList.findViewWithTag(imageUrl); if (image != null) { if (imageDrawable != null) { image.setImageDrawable(imageDrawable); } else { image.setImageResource(R.drawable.ic_default); } } } }); if (cacheDrawble != null) { holder.ivImage.setImageDrawable(cacheDrawble); } else { holder.ivImage.setImageResource(R.drawable.ic_default); } holder.tvBarName.setText(bean.getBar_Name()); // holder.tvAddress.setText(bean.getBar_Address()); StringTokenizer token = new StringTokenizer(bean.getBar_Address(), "$"); String[] add = new String[3]; int i = 0; while (token.hasMoreTokens()) { add[i] = token.nextToken(); i++; String address1 = add[0]; String string = bean.getBarStreet(); holder.tvAddress.setText(address1 + string);// 酒吧地址 } holder.tvContent.setText(bean.getBar_Intro()); double latitude; try { latitude = Double.parseDouble(bean.getLatitude()); } catch (NumberFormatException e) { latitude = 0; } double longitude; try { longitude = Double.parseDouble(bean.getLongitude()); } catch (NumberFormatException e) { longitude = 0; } if (app.getLastLocation() != null) { double distance = StringUtil.getDistance(app.getLastLocation().getLatitude(), app.getLastLocation() .getLongitude(), latitude, longitude); if (distance > 1000) { distance = distance / 1000; holder.tvDistanceLabel.setText(String.format("%.1f", distance) + "km"); } else { holder.tvDistanceLabel.setText(String.format("%.0f", distance) + "m"); } } else { holder.tvDistanceLabel.setText(""); } return convertView; } } class ViewHolder { private TextView tvBarName, tvDistanceLabel, tvAddress, tvContent; private ImageView ivImage; } /** * ViewPager的适配器 * * @author Zhoujun * */ private class MyPagerAdapter extends PagerAdapter { private ArrayList<View> views; public MyPagerAdapter(ArrayList<View> views) { this.views = views; } @Override public int getCount() { if (count == 1) { return 1; } return Integer.MAX_VALUE;// 是否循环滚动 } public void setData(ArrayList<View> views) { this.views = views; } private void clear() { if (views != null) views.clear(); this.notifyDataSetChanged(); } @Override public boolean isViewFromObject(View view, Object obj) { // return view == obj; if (view instanceof OutlineContainer) { return ((OutlineContainer) view).getChildAt(0) == obj; } else { return view == obj; } } @Override public void destroyItem(View container, int position, Object object) { // ((ViewPager) container).removeView(views.get(position)); ((ViewPager) container).removeView(viewPage.findViewFromObject(position)); //目前还不知道为什么加上这句话推荐酒吧就会出问题 } @Override public Object instantiateItem(View container, int position) { try { ((ViewPager) container).addView(views.get(position % views.size()), 0); viewPage.setObjectForPosition(views.get(position % views.size()), position); } catch (Exception e) { } return views.get(position % views.size()); } } /** * 当ViewPager中页面的状态发生改变时调用 * * @author Administrator * */ private class MyPageChangeListener implements OnPageChangeListener { @Override public void onPageSelected(int position) { if (count == 1 && position == 1) { viewPage.setCurrentItem(0); return; } currPosition = position; changeState(position); } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } }; }