package com.emop.client.fragment;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.provider.SyncStateContract.Columns;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.emop.client.R;
import com.emop.client.TaokeItemDetailActivity;
import com.emop.client.io.FmeiClient;
import com.emop.client.provider.QueryParam;
import com.emop.client.provider.Schema;
import com.emop.client.provider.model.Item;
import com.emop.client.wxapi.DensityUtil;
public class TopicItemListFragment extends Fragment {
private ViewPager viewPager = null;
private ArrayList<TopicPage> views = new ArrayList<TopicPage>();
private ArrayList<ImageView> pageIndicators = new ArrayList<ImageView>();
private LayoutInflater inflater = null;
private PagerAdapter adapter = null;
private int[] resourceIDs = new int[10];
//private int[] resourceClickIDs = new int[10];
private FmeiClient client = null; //FmeiClient.getInstance(null);
//private int indicatorLength = 0;
//private TextView pageNum = null;
private LinearLayout indicator = null;
//private View bar = null;
private Handler handler = new Handler();
private boolean isRunning = true;
/**
* 定义一个模板列表,数据内容根据模板展示。
*/
private ArrayList<TopicPage> pageTemplates = new ArrayList<TopicPage>();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState){
Log.d("xx", "onCreateView...");
client = FmeiClient.getInstance(null);
View v = inflater.inflate(R.layout.topic_item_list_fragment, container, false);
viewPager = (ViewPager)v.findViewById(R.id.viewPager);
this.inflater = inflater;
TopicPage page = new TopicPage();
views.add(page);
indicator = (LinearLayout)v.findViewById(R.id.page_indicator);
adapter = new TopicItemAdapter();
viewPager.setOnPageChangeListener(pageListener2);
viewPager.setAdapter(adapter);
return v;
}
public void onActivityCreated(Bundle savedState){
super.onActivityCreated(savedState);
View title = getActivity().findViewById(R.id.title);
if(title != null){
title.setLongClickable(true);
title.setOnLongClickListener(new RefreshLoader());
}else {
Log.d("emop", "not founc guang title.");
}
new DataLoader().start();
}
public void onResume(){
super.onResume();
isRunning = true;
}
public void onPause(){
super.onPause();
isRunning = false;
}
protected void initTemplates(){
TopicPage page = new TopicPage();
page.layout = R.layout.topic_template1;
page.itemCount = 4;
pageTemplates.add(page);
page = new TopicPage();
page.layout = R.layout.topic_template2;
page.itemCount = 4;
pageTemplates.add(page);
page = new TopicPage();
page.layout = R.layout.topic_template3;
page.itemCount = 4;
pageTemplates.add(page);
page = new TopicPage();
page.layout = R.layout.topic_template4;
page.itemCount = 4;
pageTemplates.add(page);
//resourceIDs
Resources res = getActivity().getResources();
for(int i = 0; i < 10; i++){
resourceIDs[i] = res.getIdentifier("item_" + i, "id", "com.emop.client");
if(resourceIDs[i] == 0)break;
}
}
class RefreshLoader implements OnLongClickListener{
private ProgressDialog loading = null;
public boolean onLongClick(View arg0) {
if(loading != null && loading.isShowing()) {
Log.d("xxx", "topic item list in loading...");
return false;
}else {
Log.d("xxx", "start topic item list in loading...");
}
if(loading == null){
loading = new ProgressDialog(getActivity());
loading.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
loading.setMessage("正在更新专题详情...");
loading.show();
new Thread(){
public void run(){
Uri dataUri = getActivity().getIntent().getData();
dataUri = dataUri.buildUpon().appendQueryParameter("force_refresh", "y")
.appendQueryParameter(QueryParam.PAGE_SIZE, "100")
.build();
ContentResolver resolver = getActivity().getContentResolver();
Cursor c = resolver.query(dataUri,
new String[] {Columns._ID, Item.WEIBO_ID, Item.PIC_URL},
null, null, null);
c.close();
new DataLoader().run();
loading.dismiss();
}
}.start();
return false;
}
}
class TopicItemAdapter extends PagerAdapter{
@Override
public void destroyItem(View v, int position, Object arg2) {
// TODO Auto-generated method stub
Log.d("xxx", "destroyItem..position:" + position);
ViewPager vv = (ViewPager)v;
View sv = vv.findViewById(arg2.hashCode());
if(sv != null){
vv.removeView(sv);
}
//((ViewPager)v).findViewById(arg2.hashCode());
//((ViewPager)v).removeView((View)arg2);
}
@Override
public void finishUpdate(View arg0) {
//Log.d("xxx", "finishUpdate..v:" + arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}
public int getItemPosition (Object object){
if(views.contains(object)){
return views.indexOf(object);
}else {
return POSITION_NONE;
}
}
@Override
public Object instantiateItem(View v, int position) {
//Log.d("xxx", "instantiateItem.." + v.toString() + ", position:" + position);
TopicPage page = views.get(position);
View newView = null;
if(page != null){
newView = inflater.inflate(page.layout, null);
newView.setId(page.hashCode());
((ViewPager)v).addView(newView);
}
return page;
}
@Override
public boolean isViewFromObject(View v, Object arg1) {
//Log.d("xxx", "isViewFromObject..v:" + v.toString() + ", arg1:" + arg1);
return v.getId() == arg1.hashCode();
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
@Override
public void startUpdate(View arg0) {
//Log.d("xxx", "startUpdate..v:" + arg0);
// TODO Auto-generated method stub
//this.
}
}
protected OnClickListener clickListener = new OnClickListener(){
@Override
public void onClick(View v) {
Uri dataUri = Uri.parse("content://" + Schema.AUTHORITY + "/item/" + v.getId());
Intent intent = new Intent().setClass(getActivity(),
TaokeItemDetailActivity.class);
intent.setData(dataUri);
startActivity(intent);
}
};
protected OnPageChangeListener pageListener2 = new OnPageChangeListener(){
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
Log.d("xx", "onPage selected:" + position);
//pageIndicators.add(img);
for(int i = 0; i < pageIndicators.size(); i++){
if(i == position){
pageIndicators.get(i).setImageResource(R.drawable.themepage_select);
}else {
pageIndicators.get(i).setImageResource(R.drawable.themepage);
}
}
TopicPage data = views.get(position);
View v = viewPager.findViewById(data.hashCode());
if(data != null && v != null && v.getTag() == null){
v.setTag(data);
renderPage(v, data);
}
}
protected void renderPage(View v, TopicPage data){
Resources res = getActivity().getResources();
//getActivity().getWindow()
int itemId = 0;
//.items.size()
for(int i = 0; i < data.itemCount; i++){
View sub = v.findViewById(resourceIDs[i]);
View click_sub = v.findViewById(res.getIdentifier("item_click_" + i, "id", "com.emop.client"));
if(sub == null) break;
if(i < data.items.size()){
String url;
try {
url = data.items.get(i).getString(Item.PIC_URL);
itemId = data.items.get(i).getInt("id");
if(url != null && sub instanceof ImageView){
//sub.setBackgroundResource(R.drawable.loading);
int width = sub.getMeasuredWidth();
client.tmpImgLoader.loadImage(url, (ImageView)sub, width == 0 ? 300: width, true);
if(click_sub!=null){
click_sub.setId(itemId);
click_sub.setOnClickListener(clickListener);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
sub.setVisibility(View.INVISIBLE);
click_sub.setVisibility(View.INVISIBLE);
try{
LinearLayout out = (LinearLayout)click_sub.getParent().getParent();
out.setVisibility(View.INVISIBLE);
}catch(Throwable e){
Log.d("emop", "hidden item error:" + e.toString(), e);
}
}
}
}
};
/**
* 一个专题页的数据结构。
* 1. 页面布局类型。
* 2. 布局需要用到的商品列表。 *
*/
class TopicPage {
public int layout = R.layout.topic_item_loading;
public boolean loaded = false;
public int itemCount = 0;
public List<JSONObject> items = null;
}
class DataLoader extends Thread{
public void run(){
initTemplates();
Intent intent = getActivity().getIntent();
Uri dataUri = intent.getData();
dataUri = dataUri.buildUpon().appendQueryParameter(QueryParam.PAGE_SIZE, "100").build();
ContentResolver resolver = getActivity().getContentResolver();
Cursor c = resolver.query(dataUri,
new String[] {Columns._ID, Item.WEIBO_ID, Item.PIC_URL},
null, null, null);
final ArrayList<JSONObject> result = new ArrayList<JSONObject>(64);
int idIndex = -1, picIndex = -1;
try{
boolean hasMore = c.moveToFirst();
if(hasMore){
idIndex = c.getColumnIndex(Columns._ID);
if(idIndex == -1){
idIndex = c.getColumnIndex("id");
}
picIndex = c.getColumnIndex(Item.PIC_URL);
}
for(; hasMore; hasMore = c.moveToNext()){
JSONObject obj = new JSONObject();
int id = c.getInt(idIndex);
try {
obj.put("id", id);
String pic = c.getString(picIndex);
obj.put(Item.PIC_URL, pic);
} catch (JSONException e) {
Log.w("emop", "load topic error:" + e.toString(), e);
}
result.add(obj);
}
}finally{
if(c != null){
c.close();
}
}
if(!isRunning)return;
if(result.size() > 0){
handler.post(new Runnable(){
public void run(){
layoutPage(result);
}
});
}else {
handler.post(new Runnable(){
public void run(){
View v = viewPager.getChildAt(0);
if(v != null){
View error = v.findViewById(R.id.error_view);
error.setVisibility(View.VISIBLE);
error = v.findViewById(R.id.progressbar_loading);
error.setVisibility(View.GONE);
}
Toast.makeText(getActivity(),"亲,网络出错啦!", Toast.LENGTH_SHORT).show();
}
});
}
}
protected void layoutPage(ArrayList<JSONObject> itemList){
int templateCount = pageTemplates.size();
int templateIndex = 0;
int startIndex = 0;
int endIndex = 0;
views.clear();
while(startIndex < itemList.size()){
TopicPage temp = pageTemplates.get(templateIndex++ % templateCount);
//if(temp.s)
endIndex = Math.min(startIndex + temp.itemCount, itemList.size());
List<JSONObject> sub = itemList.subList(startIndex, endIndex);
startIndex = endIndex;
TopicPage page = new TopicPage();
page.layout = temp.layout;
page.itemCount = temp.itemCount;
page.items = sub;
views.add(page);
}
indicator.removeAllViews();
pageIndicators.clear();
int margin = 10;
//@todo 不知道为啥,有时间竟然抛出空指针异常。理论上说这个地方context总是有的。前面已经使用过了。
try{
margin = DensityUtil.dip2px(getActivity(), 5);
}catch(Throwable e){}
LinearLayout.LayoutParams lp = null;
for(int i = 0; i < views.size() ; i++){
ImageView img = new ImageView(getActivity());
if(views.size() < 10){
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = margin;
lp.rightMargin = margin;
}else {
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.weight = 1;
}
img.setLayoutParams(lp);
if(i == 0){
img.setImageResource(R.drawable.themepage_select);
}else {
img.setImageResource(R.drawable.themepage);
}
indicator.addView(img);
pageIndicators.add(img);
}
handler.post(new Runnable(){
public void run(){
Log.d("xx", "cleanup all sub view, add page count:" + views.size());
adapter.notifyDataSetChanged();
viewPager.setCurrentItem(0);
}
});
handler.postDelayed(new Runnable(){
public void run(){
pageListener2.onPageSelected(0);
}
}, 100);
}
}
}