package com.roboo.like.google.fragments;
import java.util.LinkedList;
import net.dynamicandroid.listview.DynamicListView;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.Keyframe;
import android.animation.LayoutTransition;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.roboo.like.google.GoogleApplication;
import com.roboo.like.google.R;
import com.roboo.like.google.adapters.CommentAdapter;
import com.roboo.like.google.async.CommentAsyncTaskLoader;
import com.roboo.like.google.models.CommentItem;
import com.roboo.like.google.views.FooterView;
public class CommentFragment extends BaseWithProgressFragment implements LoaderCallbacks<LinkedList<CommentItem>>
{
private static final String ARG_NEWS_ID = "news_id";
/** 异步图片加载器 */
private ImageLoader mImageLoader;
/** ViewGroup中添加View时的动画操作对象 */
private LayoutTransition mTransitioner;
private CommentAdapter mAdapter;
private LinkedList<CommentItem> mData;
private DynamicListView mListView;
private FooterView mFooterView;
private Button mBtnLoadNext;
private ProgressBar mFooterProgressBar;
private int mCurrentCommentPageNo = 1;
private PopupWindow mPopupWindow;
public static CommentFragment newInstance(String newsId)
{
CommentFragment fragment = new CommentFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(ARG_NEWS_ID, newsId);
fragment.setArguments(bundle);
return fragment;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_comment, null);// TODO
mListView = (DynamicListView) view.findViewById(R.id.dlv_list);
mFooterView = new FooterView(getActivity(), FooterView.TYPE_BUTTON);
mFooterProgressBar = mFooterView.getFooterProgressBar();
mBtnLoadNext = mFooterView.getButton();
return view;
}
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mImageLoader = ImageLoader.getInstance();
mImageLoader.init(ImageLoaderConfiguration.createDefault(getActivity()));
setListener();
getActivity().getSupportLoaderManager().initLoader(0, getArguments(), this);
}
private void setListener()
{
mBtnLoadNext.setOnClickListener(new OnClickListenerImpl());
mListView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
if (parent.getAdapter().getItemViewType(position) != AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)
{
showPopupWindow(view);
}
}
});
}
private void showPopupWindow(View view)
{
int height = (int) (48 * getResources().getDisplayMetrics().density);
int width = (int) (getResources().getDisplayMetrics().widthPixels - 20 * getResources().getDisplayMetrics().density);
if (mPopupWindow == null)
{
View contentView = LayoutInflater.from(getActivity()).inflate(R.layout.popupwindow_comment, null);
mPopupWindow = new PopupWindow(contentView, width, height);
}
if (mPopupWindow.isShowing())
{
mPopupWindow.dismiss();
}
mPopupWindow.showAsDropDown(view);
}
public Loader<LinkedList<CommentItem>> onCreateLoader(int id, Bundle args)
{
String newsId = getArguments().getString(ARG_NEWS_ID);
return new CommentAsyncTaskLoader(getActivity(), newsId, mCurrentCommentPageNo);
}
@Override
public void onLoadFinished(Loader<LinkedList<CommentItem>> loader, LinkedList<CommentItem> data)
{
mFooterProgressBar.setVisibility(View.INVISIBLE);
mBtnLoadNext.setText("点击加载下一页");
if (null != data)
{
setLinearContainerAnimation();
int ltrb = (int) (10 * getActivity().getResources().getDisplayMetrics().density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params.bottomMargin = ltrb;
if (mData == null)
{
mData = data;
mAdapter = new CommentAdapter(getActivity(), mData);
mListView.addFooterView(mFooterView);
mListView.setAdapter(mAdapter);
}
else
{
mData.addAll(data);
mAdapter.notifyDataSetChanged();
}
GoogleApplication.TEST = false;
if (GoogleApplication.TEST)
{
for (CommentItem item : data)
{
System.out.println("评论Item = 【 " + item + " 】");
}
}
}
else
{
if (mCurrentCommentPageNo == 1)
{
mListView.setEmptyView(getActivity().findViewById(android.R.id.empty));
}
else if (mCurrentCommentPageNo > 1)
{
mCurrentCommentPageNo--;
mBtnLoadNext.setText("所有数据加载完毕");
mBtnLoadNext.setClickable(false);
}
}
mProgressBar.setVisibility(View.GONE);
}
public void onLoaderReset(Loader<LinkedList<CommentItem>> loader)
{
}
/** 设置ViewGroup添加子View时的动画 */
private void setLinearContainerAnimation()
{
mTransitioner = new LayoutTransition();
mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 100);// 添加View
mTransitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 100);// 移除View
// 定制动画
setupCustomAnimations();
// 设置mLinearContainer布局改变时动画
// mLinearContainer.setLayoutTransition(mTransitioner);
}
/** 定制ViewGroup添加View时显示的动画 */
private void setupCustomAnimations()
{
// 添加改变时执行
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 1);
PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 1);
PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX", 1f, 0f, 1f);
PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY", 1f, 0f, 1f);
final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX, pvhScaleY).setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));
mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
changeIn.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setScaleX(1f);
view.setScaleY(1f);
}
});
// 移除改变时执行
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhRotation).setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);
changeOut.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotation(0f);
}
});
// 添加时执行
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f, 0f).setDuration(mTransitioner.getDuration(LayoutTransition.APPEARING));
mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
animIn.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationY(0f);
}
});
// 移除View时执行的动画
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f, 90f).setDuration(mTransitioner.getDuration(LayoutTransition.DISAPPEARING));
mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
animOut.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationX(0f);
}
});
}
private class OnClickListenerImpl implements OnClickListener
{
public void onClick(View v)
{
loadNextData();
}
}
private void loadNextData()
{
mCurrentCommentPageNo++;
mFooterProgressBar.setVisibility(View.VISIBLE);
mBtnLoadNext.setText("正在获取数据……");
getActivity().getSupportLoaderManager().restartLoader(0, getArguments(), this);
}
}