package com.emop.client.fragment; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.BaseColumns; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.SimpleAdapter; import android.widget.AdapterView.OnItemClickListener; import android.widget.LinearLayout; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout.LayoutParams; import android.widget.SimpleAdapter.ViewBinder; import com.baidu.mobstat.StatService; import com.emop.client.Constants; import com.emop.client.GuangItemListActivity; import com.emop.client.HotActivity; import com.emop.client.MutilFragmentActivity; import com.emop.client.R; import com.emop.client.io.FmeiClient; import com.emop.client.provider.Schema; import com.emop.client.provider.model.Topic; import com.emop.client.widget.CateImageView; import com.emop.client.widget.HotCateImageView; import com.emop.client.widget.SoildGridView; import com.emop.client.wxapi.DensityUtil; public class HotCateFragment extends Fragment{ private ArrayList<HashMap<String, Object>> cateList; private SimpleAdapter adapter = null; //private CursorAdapter adapter = null; //(Context context, Cursor c) private int cateHeight = 0; private int picMarginDp = 2; private int winWidth = 0; protected Handler handler = new Handler(); private boolean isRunning = false; public void onResume(){ super.onResume(); isRunning = true; } public void onPause(){ super.onPause(); isRunning = false; } public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedState){ final SoildGridView v = new SoildGridView(getActivity()); cateList = new ArrayList<HashMap<String, Object>>(); LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); v.setLayoutParams(params); v.setFadingEdgeLength(0); v.setSelector(R.color.color_transparent); v.setNumColumns(3); v.setFocusable(false); final FmeiClient client = FmeiClient.getInstance(getActivity(), false); Rect displayRectangle = new Rect(); Window window = getActivity().getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle); winWidth = displayRectangle.width(); cateHeight = (int)((winWidth- 6 * DensityUtil.dip2px(getActivity(), picMarginDp)) / 3 * 1.2); adapter = new SimpleAdapter(getActivity(), //没什么解释 cateList, //数据来源 R.layout.hot_view_item,//night_item的XML实现 new String[] {"ItemImage", }, //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.item_pic, }){ public View getView(int position, View convertView, ViewGroup parent){ final View v = super.getView(position, convertView, parent); v.getLayoutParams().height = cateHeight; int fontSize = DensityUtil.dip2px(getActivity(), 14); View v2 = v.findViewById(R.id.item); if(v2 instanceof HotCateImageView){ HotCateImageView cateImage = (HotCateImageView)v2; HashMap<String, Object> item = (HashMap<String, Object>)adapter.getItem(position); cateImage.name = item.get("ItemText") + ""; cateImage.pic = item.get("ItemImage") + ""; cateImage.id = (Integer)item.get("ItemID"); cateImage.tags = item.get("ItemTags") + ""; cateImage.fontSize = fontSize; final String des = cateImage.pic; cateImage.setTag(cateImage.pic); Bitmap bm = client.tmpImgLoader.cache.get(des, winWidth /3, false, false); ImageView img = cateImage; if(bm != null){ img.setImageBitmap(bm); }else { client.tmpImgLoader.runTask(new Runnable(){ @Override public void run() { final Bitmap newBm = client.tmpImgLoader.cache.get(des, winWidth /3, false, true); if(newBm != null){ handler.post(new Runnable(){ @Override public void run() { View vv = v.findViewWithTag(des); if(vv != null){ ImageView v2 = (ImageView)vv; v2.setScaleType(ScaleType.CENTER_CROP); v2.setImageBitmap(newBm); } } }); } } }); } } return v; } }; adapter.setViewBinder(new ViewBinder(){ @Override public boolean setViewValue(View v, Object data, final String picUrl) { return true; }} ); v.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { HotCateImageView cateImage = (HotCateImageView)v.findViewById(R.id.item); StatService.onEvent(getActivity(), "click_hot", cateImage.id + "_" + cateImage.name, 1); if(cateImage != null){ String tags = cateImage.tags; Log.d(Constants.TAG_EMOP, "click activity hot:" + cateImage.id + ", tags:" + cateImage.tags); if(tags == null || tags.trim().length() == 0 || tags.trim().equals("0")){ Uri dataUri = Uri.parse("content://" + Schema.AUTHORITY + "/hot/" + cateImage.id + "/list"); Intent intent = new Intent().setClass(getActivity(), GuangItemListActivity.class); intent.putExtra("title", cateImage.name); intent.setData(dataUri); startActivity(intent); }else if(tags.equals("shop")){ Intent intent = new Intent(); intent.setClass(getActivity(), MutilFragmentActivity.class); intent.putExtra("view_id", new int[]{R.layout.shop_list}); startActivity(intent); }else if(tags.equals("rebate")){ Intent intent = new Intent(); intent.setClass(getActivity(), MutilFragmentActivity.class); intent.putExtra("view_id", new int[]{R.layout.rebate_list}); startActivity(intent); } } }}); v.setAdapter(adapter); return v; } protected void updateData(Cursor c){ cateList.clear(); /* HashMap<String, Object> shop = new HashMap<String, Object>(); shop.put("ItemImage", "http://tdcms.b0.upaiyun.com/app/link_web/hot_undefined_03_07_0926.png"); shop.put("ItemText", "店铺"); shop.put("ItemID", 1); shop.put("ItemTags", "shop"); */ HashMap<String, Object> rebate = new HashMap<String, Object>(); rebate.put("ItemImage", "http://tdcms.b0.upaiyun.com/app/link_web/hot_11126_03_07_0927.png"); rebate.put("ItemText", "限时特惠"); rebate.put("ItemID", 2); rebate.put("ItemTags", "rebate"); //cateList.add(shop); cateList.add(rebate); if(c != null){ boolean hasMore = c.moveToFirst(); int nameIndex = -1, picIndex = -1, idIndex = -1, tagIndex = -1; if(hasMore){ picIndex = c.getColumnIndex(Topic.FRONT_PIC); idIndex = c.getColumnIndex(BaseColumns._ID); nameIndex = c.getColumnIndex(Topic.TITLE); tagIndex = c.getColumnIndex(Topic.TAGS); }else { Log.d(Constants.TAG_EMOP, "Not found data by uri:"); } for(;hasMore; hasMore = c.moveToNext()){ HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", c.getString(picIndex)); map.put("ItemText", c.getString(nameIndex)); map.put("ItemID", c.getInt(idIndex)); map.put("ItemTags", c.getInt(tagIndex)); cateList.add(map); } } } public void onActivityCreated(Bundle savedState){ super.onActivityCreated(savedState); /** * 更新Loader数据。 */ //getLoaderManager().restartLoader(0, null, this); getLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { return new CursorLoader(getActivity(), Schema.HOT_CATE_LIST, new String[] { BaseColumns._ID, Topic.TITLE, Topic.TAGS, Topic.ITEM_COUNT, Topic.DESC, Topic.FRONT_PIC, Topic.UPDATE_TIME }, null, null, null); } /** * 在Loader创建成功时返回。有可能会在Fragment还没有初始化完。就被回 * 调了。在代码里面需要处理这种情况。 * @param arg0 * @param arg1 */ @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { Log.d("xx", "onLoad finishied, count:" + cursor.getCount()); if(adapter != null){ Log.d("xx", "swapCursor finishied."); updateData(cursor); adapter.notifyDataSetChanged(); } } @Override public void onLoaderReset(Loader<Cursor> arg0) { updateData(null); } } ); getActivity().getContentResolver().registerContentObserver(Schema.HOT_CATE_LIST, false, new ContentObserver(new Handler()){ public void onChange(boolean selfChange) { if(isRunning) return; Log.d(Constants.TAG_EMOP, "host cat list is changed..."); getLoaderManager().getLoader(0).forceLoad(); } }); } }