package com.emop.client; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Intent; import android.net.Uri; import android.net.Uri.Builder; import android.os.Bundle; import android.util.Log; import android.util.SparseIntArray; import android.view.Display; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.baidu.mobstat.StatService; import com.emop.client.io.ApiResult; import com.emop.client.io.TaodianApi; 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.wxapi.DensityUtil; /** * 专题的瀑布流展示View. * @author deonwu * */ public class GuangItemListActivity extends BaseActivity { 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 LinearLayout errorView = null; //private TextView errorInfo = null; private Uri dataUri = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guang_item_list_view); Intent intent = this.getIntent(); dataUri = intent.getData(); String title = intent.getStringExtra("title"); if(title != null && title.trim().length() >0){ TextView v = (TextView)findViewById(R.id.title); v.setText(title); } initWaterFallLayout(); waterfallView.showHeadLoader(); errorView = (LinearLayout)this.findViewById(R.id.error_view); List<String> seg = dataUri.getPathSegments(); if(seg.size() > 2){ StatService.onEvent(this, seg.get(0) + "_" + seg.get(1), "view", 1); } View tab = findViewById(R.id.nav_fav_tabs); if(tab != null){ tab.setVisibility(View.GONE); } } protected void onResume(){ super.onResume(); if(waterfallView.isHeadLoading() && !waterfallView.isLoading()){ waterfallView.load(); }else { Log.d(Constants.TAG_EMOP, "header:" + waterfallView.isHeadLoading() + ", loading:" + waterfallView.isLoading()); } } 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); //fallOption.itemWidth -= fallOption.itemMarginSize * 2; waterfallView.commitWaterFall(fallOption); } public void onFinish(View v){ finish(); } /** * 管理瀑布流的数据加载,相关功能。 * 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; private long lastShowNoItem = System.currentTimeMillis(); //private View bottomLoader = null; private int reRefreshTimes = 0; @Override public void onBottom() { Log.d("xxx", "on buttom"); if(lastRefreshCount > 0){ final View v = findViewById(R.id.bottom_loader); new Thread(){ public void run(){ if(isLoading) return; isLoading = true; loadMorePage(); isLoading = false; } }.start(); }else { if(System.currentTimeMillis() - lastShowNoItem > 1000 * 5){ lastShowNoItem = System.currentTimeMillis(); showToast("亲,没有宝贝啦~~"); } } } 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() { Log.d("xx", "refresh...."); hideEmptyView(); cleanExpiredData(); Builder uriBuilder = dataUri.buildUpon(); uriBuilder.appendQueryParameter("pageNo", "0"); uriBuilder.appendQueryParameter("pageSize", "30"); uriBuilder.appendQueryParameter("startTime", startTime); //uriBuilder.appendQueryParameter("endTime", startTime); if(reRefreshTimes > 3){ uriBuilder.appendQueryParameter("no_cache", "y"); reRefreshTimes = 0; }else { reRefreshTimes++; } 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); handler.post(new Runnable(){ public void run(){ final View v = findViewById(R.id.bottom_loader); if(v != null){ v.setVisibility(View.VISIBLE); } } }); }else { showEmptyView(); } } private void loadMorePage(){ Log.d("xx", "load more page...."); Builder uriBuilder = dataUri.buildUpon(); uriBuilder.appendQueryParameter("pageNo", this.refreshPage + ""); uriBuilder.appendQueryParameter("pageSize", "30"); //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++; JSONObject o = r.getJSONObject("data"); // getString("data.item_count"); JSONArray array = null; try { array = o.getJSONArray("items"); } catch (JSONException e) { } if(array != null && array.length() > 0){ lastRefreshCount = array.length(); }else { lastRefreshCount = 0; } if(lastRefreshCount > 0){ this.addApiResultToContainer(r); }else { handler.post(new Runnable(){ public void run(){ final View v = findViewById(R.id.bottom_loader); if(v != null){ v.setVisibility(View.GONE); } } }); } }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) { final long st = System.currentTimeMillis(); try{ JSONObject json = r.json.getJSONObject("data"); JSONArray jarray = json.getJSONArray("items"); int itemId = 0; for(int i = 0; i < jarray.length(); i++){ try{ json = jarray.getJSONObject(i); itemId = json.getInt("item_id"); if(itemId <= 0)continue; //Log.d("dd", "ading:" + itemId); if(loadedItem.get(itemId, -1) > 0){ Log.d("dd", "already added to view:" + itemId); continue; }else { loadedItem.append(itemId, itemId); } itemId = json.getInt("id"); waterfallView.addImage(json.getString(Item.PIC_URL), (int) Math.ceil(waterfallView.loaded_count / (double) COLUME_NUM), itemId, (float)json.getDouble(Item.PRICE), (float)json.getDouble(Item.RECT_RATE)); }catch (JSONException e) { Log.d(Constants.TAG_EMOP, "json error:" + e.toString(), e); } } }catch (JSONException e1) { Log.d(Constants.TAG_EMOP, "json error:" + e1.toString(), e1); } } } }