package com.emop.client; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.net.Uri; import android.net.Uri.Builder; import android.os.Bundle; import android.util.SparseIntArray; import android.view.Display; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import android.widget.TextView; import com.emop.client.fragment.ShopListFragment; import com.emop.client.io.ApiResult; import com.emop.client.io.TaodianApi; import com.emop.client.provider.Schema; import com.emop.client.provider.model.Item; import com.emop.client.widget.WaterFallOption; import com.emop.client.widget.WaterFallView; import com.emop.client.widget.WaterFallView.OnRefreshListener; import com.emop.client.widget.WaterFallView.OnScrollListener; import com.emop.client.widget.item.FlowView; import com.emop.client.wxapi.DensityUtil; import com.tencent.mm.sdk.platformtools.Log; public class MyFavoriteActivity extends PrivateTabActivity{ private WaterFallDataLoader dataLoader = null; private static final int COLUME_NUM = 3; private static final int PIC_FRONT_SIZE = 10; private static final int PIC_MARGIN_SIZE = 2; private WaterFallView waterfallView; private ShopListFragment fragment; private View shopList = null; private LinearLayout errorView = null; private View tabView = null; private View taokeTab = null; private View shopTab = null; private Uri dataUri = null; public static List<Integer> removedList = new ArrayList<Integer>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guang_item_list_view); //Intent intent = this.getIntent(); //dataUri = intent.getData(); initWaterFallLayout(); waterfallView.showHeadLoader(); int padding = DensityUtil.dip2px(this, 50); waterfallView.setPadding(waterfallView.getPaddingLeft(), waterfallView.getPaddingTop(), waterfallView.getPaddingRight(), padding); errorView = (LinearLayout)this.findViewById(R.id.no_fav); TextView v = (TextView)findViewById(R.id.title); v.setText("我的收藏"); View v2 = findViewById(R.id.img_main_menu_back); v2.setVisibility(View.GONE); tabView = findViewById(R.id.nav_fav_tabs); taokeTab = findViewById(R.id.fav_taoke); if(taokeTab != null){ taokeTab.setOnClickListener(tabSwitch); } shopTab = findViewById(R.id.fav_shop); if(shopTab != null){ shopTab.setOnClickListener(tabSwitch); } //shopList = findViewById(R.id.shopList); //fragment = (ShopListFragment)getSupportFragmentManager().findFragmentById(R.id.shopList); //Bundle args = new Bundle(); //args.putString("uri", Schema.SHOP_LIST.toString()); //f.setArguments(args); } protected void onResume(){ super.onResume(); if(client.isLogined() && waterfallView.isHeadLoading() && !waterfallView.isLoading()){ waterfallView.load(); }else { Log.d(Constants.TAG_EMOP, "header:" + waterfallView.isHeadLoading() + ", loading:" + waterfallView.isLoading()); } //进入我的收藏,显示图片后,在进入详情页取消收藏。在回到收藏后,还是在收藏里面显示。 for(Integer id : removedList){ View v = waterfallView.findViewById(id); if(v != null){ Log.d(Constants.TAG_EMOP, "remove item:" + id); waterfallView.deleteItems((FlowView)v); } } removedList.clear(); } protected void onStop(){ super.onStop(); } private void initWaterFallLayout() { dataLoader = new WaterFallDataLoader(); //1 初始化waterfall waterfallView = (WaterFallView) findViewById(R.id.waterfall_scroll); //2 初始化显示容器 LinearLayout waterfall_container = (LinearLayout) findViewById(R.id.waterfall_container); //3,设置滚动监听 waterfallView.setOnScrollListener(dataLoader); waterfallView.setOnRefrreshListener(dataLoader); //4,实例一个设置 WaterFallOption fallOption = new WaterFallOption(waterfall_container, 0, COLUME_NUM); fallOption.headLoader = findViewById(R.id.head_loader); Display display = null; display = getWindowManager().getDefaultDisplay(); fallOption.itemWidth = display.getWidth() / COLUME_NUM; fallOption.itemFontSize = DensityUtil.dip2px(this, PIC_FRONT_SIZE); fallOption.itemMarginSize = DensityUtil.dip2px(this, PIC_MARGIN_SIZE); waterfallView.commitWaterFall(fallOption); } private OnClickListener tabSwitch = new OnClickListener(){ @Override public void onClick(View v) { if(v.getId() == R.id.fav_taoke){ showTaoke(v); }else { showShop(v); } } private void showTaoke(View v){ taokeTab.setEnabled(false); shopTab.setEnabled(true); tabView.setBackgroundResource(R.drawable.fav_select_left_bg); shopList.setVisibility(View.GONE); waterfallView.setVisibility(View.VISIBLE); } private void showShop(View v){ taokeTab.setEnabled(true); shopTab.setEnabled(false); tabView.setBackgroundResource(R.drawable.fav_select_right_bg); fragment.reload(); shopList.setVisibility(View.VISIBLE); waterfallView.setVisibility(View.GONE); } }; /** * 管理瀑布流的数据加载,相关功能。 * 1. 先从网络下载一次40条。 * 2. 如果加载失败,检查本地是否有数据。 没有,提示网络失败。有,加载本地数据。 * * 3. 每次先从加载10条。如果没有更多数据了,从网上刷新。 * * @author deonwu */ class WaterFallDataLoader implements OnScrollListener, OnRefreshListener{ //private int loadedCount = 0; //private int pageSize = 10; //private int curPage = 0; //服务器端更新的页数。 private int refreshPage = 0; private int lastRefreshCount = 0; //private boolean isInited = false; private String startTime = "1999-10-10"; private String endTime = "2999-10-10"; public SparseIntArray loadedItem = new SparseIntArray(); private boolean isLoading = false; @Override public void onBottom() { Log.d("xxx", "on buttom"); new Thread(){ public void run(){ if(isLoading) return; isLoading = true; loadMorePage(); isLoading = false; } }.start(); } public void cleanExpiredData(){ Log.d(Constants.TAG_EMOP, "cleanExpiredData...."); getContentResolver().delete(dataUri, Item.LOCAL_UPDATE_TIME + " < ?", new String[]{(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 2) + ""}); } @Override public void onTop() { } @Override public void onScroll() { } @Override public void onAutoScroll(int l, int t, int oldl, int oldt) { } @Override public void onRefresh() { String myFavId = client.getFavoriteId(); if(myFavId == null || myFavId.trim().length() == 0){ Log.d("xx", "not found myfav id...."); return; } dataUri = Uri.parse("content://" + Schema.AUTHORITY + "/myfav/" + myFavId + "/list"); Log.d("xx", "refresh...."); hideEmptyView(); cleanExpiredData(); Builder uriBuilder = dataUri.buildUpon(); uriBuilder.appendQueryParameter("pageNo", "0"); uriBuilder.appendQueryParameter("pageSize", "20"); uriBuilder.appendQueryParameter("startTime", startTime); //uriBuilder.appendQueryParameter("endTime", startTime); ApiResult r = client.refreshDataByUri(getContentResolver(), uriBuilder.build(), TaodianApi.STATUS_NORMAL, true); if(r != null && r.isOK){ refreshPage = 1; String count = r.getString("data.item_count"); if(count != null && count.length() > 0){ lastRefreshCount = Integer.parseInt(count); }else { lastRefreshCount = 0; } }else { if(r == null){ showToast("啊哦,网速不给力啊~"); }else { // showToast("系统错误,请联系管理员。" + r.errorMsg()); } } if(lastRefreshCount > 0){ this.addApiResultToContainer(r); }else { showEmptyView(); } } private void loadMorePage(){ Log.d("xx", "load more page...."); if(lastRefreshCount == 0){ Log.d("xx", "last load is empty, ignore to load."); return; } Builder uriBuilder = dataUri.buildUpon(); uriBuilder.appendQueryParameter("pageNo", this.refreshPage + ""); uriBuilder.appendQueryParameter("pageSize", "20"); //uriBuilder.appendQueryParameter("startTime", startTime); uriBuilder.appendQueryParameter("endTime", endTime); ApiResult r = client.refreshDataByUri(getContentResolver(), uriBuilder.build(), TaodianApi.STATUS_NORMAL, true); if(r != null && r.isOK){ refreshPage++; String count = r.getString("data.item_count"); if(count != null && count.length() > 0){ lastRefreshCount = Integer.parseInt(count); }else { lastRefreshCount = 0; } if(lastRefreshCount > 0){ this.addApiResultToContainer(r); } }else{ if(r == null){ showToast("啊哦,网速不给力啊~"); }else { // showToast("系统错误,请联系管理员。" + r.errorMsg()); } } } private void hideEmptyView(){ handler.post(new Runnable() { @Override public void run() { if(errorView != null){ errorView.setVisibility(View.GONE); } }} ); } private void showEmptyView(){ handler.post(new Runnable() { @Override public void run() { if(errorView != null){ errorView.setVisibility(View.VISIBLE); } }} ); } private void addApiResultToContainer(final ApiResult r) { handler.post(new Runnable(){ public void run(){ try { JSONObject json = r.json.getJSONObject("data"); JSONArray jarray = json.getJSONArray("items"); int itemId = 0; for(int i = 0; i < jarray.length(); i++){ json = jarray.getJSONObject(i); itemId = json.getInt("item_id"); if(loadedItem.get(itemId, -1) > 0){ Log.d("dd", "already added to view:" + itemId); continue; }else { loadedItem.append(itemId, itemId); } itemId = json.getInt("id"); float rectRate = 0; if(json.has(Item.RECT_RATE)){ rectRate = (float)json.getDouble(Item.RECT_RATE); }else { rectRate = 0; } waterfallView.addImage(json.getString(Item.PIC_URL), (int) Math.ceil(waterfallView.loaded_count / (double) COLUME_NUM), itemId, (float)json.getDouble(Item.PRICE), rectRate); } } catch (JSONException e) { e.printStackTrace(); } } }); } } }