package com.jaydenxiao.androidfire.ui.zone.activity; import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.os.Handler; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewTreeObserver; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import com.aspsine.irecyclerview.IRecyclerView; import com.aspsine.irecyclerview.OnLoadMoreListener; import com.aspsine.irecyclerview.OnRefreshListener; import com.aspsine.irecyclerview.animation.ScaleInAnimation; import com.aspsine.irecyclerview.bean.PageBean; import com.aspsine.irecyclerview.widget.LoadMoreFooterView; import com.github.clans.fab.FloatingActionButton; import com.github.clans.fab.FloatingActionMenu; import com.jaydenxiao.androidfire.R; import com.jaydenxiao.androidfire.ui.zone.adapter.CircleAdapter; import com.jaydenxiao.androidfire.ui.zone.bean.CircleItem; import com.jaydenxiao.androidfire.ui.zone.bean.CommentConfig; import com.jaydenxiao.androidfire.ui.zone.bean.CommentItem; import com.jaydenxiao.androidfire.ui.zone.bean.FavortItem; import com.jaydenxiao.androidfire.ui.zone.contract.CircleZoneContract; import com.jaydenxiao.androidfire.ui.zone.model.ZoneModel; import com.jaydenxiao.androidfire.ui.zone.presenter.CircleZonePresenter; import com.jaydenxiao.androidfire.ui.zone.widget.CommentListView; import com.jaydenxiao.androidfire.ui.zone.widget.ZoneHeaderView; import com.jaydenxiao.common.base.BaseActivity; import com.jaydenxiao.common.baseapp.AppCache; import com.jaydenxiao.common.commonutils.DisplayUtil; import com.jaydenxiao.common.commonutils.KeyBordUtil; import com.jaydenxiao.common.commonutils.LogUtils; import com.jaydenxiao.common.commonutils.ToastUitl; import com.jaydenxiao.common.commonwidget.LoadingTip; import com.jaydenxiao.common.commonwidget.NormalTitleBar; import java.util.List; import butterknife.Bind; import butterknife.OnClick; import butterknife.OnLongClick; /** * des:朋友圈 * Created by xsf * on 2016.07.11:19 */ public class CircleZoneActivity extends BaseActivity<CircleZonePresenter, ZoneModel> implements CircleZoneContract.View, View.OnClickListener { @Bind(R.id.ntb) NormalTitleBar ntb; @Bind(R.id.irc) IRecyclerView irc; @Bind(R.id.loadedTip) LoadingTip loadedTip; @Bind(R.id.circleEt) EditText circleEt; @Bind(R.id.sendIv) ImageView sendIv; @Bind(R.id.editTextBodyLl) LinearLayout editTextBodyLl; //朋友圈头部 ZoneHeaderView zoneHeaderView; @Bind(R.id.fab1) FloatingActionButton fab1; @Bind(R.id.fab2) FloatingActionButton fab2; @Bind(R.id.fab3) FloatingActionButton fab3; @Bind(R.id.fab4) FloatingActionButton fab4; @Bind(R.id.fab5) FloatingActionButton fab5; @Bind(R.id.menu_red) FloatingActionMenu menuRed; private CircleAdapter mAdapter; private CommentConfig mCommentConfig; private int mScreenHeight; private int mEditTextBodyHeight; private int mCurrentKeyboardH; private int mSelectCircleItemH; private int mSelectCommentItemOffset; private LinearLayoutManager linearLayoutManager; /** * 启动入口 * * @param context */ public static void startAction(Context context) { Intent intent = new Intent(context, CircleZoneActivity.class); context.startActivity(intent); } @Override public int getLayoutId() { return R.layout.fra_circle_list; } @Override public void initPresenter() { mPresenter.setVM(this, mModel); } /** * 初始化 */ public void initView() { menuRed.setClosedOnTouchOutside(true); //点赞效果初始化 ntb.setTitleText(getString(R.string.circle_zone)); //滑动列表关闭输入框 irc.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (editTextBodyLl.getVisibility() == View.VISIBLE) updateEditTextBodyVisible(View.GONE, null); return false; } }); //初始化头部未读消息 zoneHeaderView = new ZoneHeaderView(this); zoneHeaderView.setData(getString(R.string.nick_name), AppCache.getInstance().getIcon()); irc.addHeaderView(zoneHeaderView); mAdapter = new CircleAdapter(this, mPresenter); mAdapter.openLoadAnimation(new ScaleInAnimation()); linearLayoutManager = new LinearLayoutManager(this); irc.setLayoutManager(linearLayoutManager); irc.setAdapter(mAdapter); //监听recyclerview滑动 setViewTreeObserver(); //上拉刷新 irc.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { mAdapter.getPageBean().setRefresh(true); loadData(); } }); //下拉加载更多 irc.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(View loadMoreView) { irc.setLoadMoreStatus(LoadMoreFooterView.Status.LOADING); new Handler().postDelayed(new Runnable() { @Override public void run() { mAdapter.getPageBean().setRefresh(false); loadData(); } }, 1000); } }); //监听列表滑动 irc.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { boolean isSignificantDelta = Math.abs(dy) > ViewConfiguration.getTouchSlop(); if (isSignificantDelta) { if (dy > 0) { menuRed.hideMenuButton(true); } else { menuRed.showMenuButton(true); } } } }); //首次加载数据 loadData(); } /** * 初始化数据 */ private void loadData() { new Handler().postDelayed(new Runnable() { @Override public void run() { //刷新时才查未读条数 if (mAdapter.getPageBean().isRefresh()) { mPresenter.getNotReadNewsCount(); } mPresenter.getListData("0", AppCache.getInstance().getUserId(), mAdapter.getPageBean().getLoadPage(), mAdapter.getPageBean().getRows()); } }, 500); } /** * 监听recyclerview滑动 */ private void setViewTreeObserver() { final ViewTreeObserver swipeRefreshLayoutVTO = irc.getViewTreeObserver(); swipeRefreshLayoutVTO.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); irc.getWindowVisibleDisplayFrame(r); int statusBarH = getStatusBarHeight();//状态栏高度 int screenH = irc.getRootView().getHeight(); if (r.top != statusBarH) { //在这个demo中r.top代表的是状态栏高度,在沉浸式状态栏时r.top=0,通过getStatusBarHeight获取状态栏高度 r.top = statusBarH; } int keyboardH = screenH - (r.bottom - r.top); LogUtils.logd("screenH= " + screenH + " &keyboardH = " + keyboardH + " &r.bottom=" + r.bottom + " &top=" + r.top + " &statusBarH=" + statusBarH); if (keyboardH == mCurrentKeyboardH) {//有变化时才处理,否则会陷入死循环 return; } mCurrentKeyboardH = keyboardH; mScreenHeight = screenH;//应用屏幕的高度 mEditTextBodyHeight = editTextBodyLl.getHeight(); //偏移listview if (irc != null && mCommentConfig != null) { int index = mCommentConfig.circlePosition + irc.getHeaderContainer().getChildCount() + 1; linearLayoutManager.scrollToPositionWithOffset(index, getListviewOffset(mCommentConfig)); } } }); } /** * 获取状态栏高度 * * @return */ private int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } /** * 点击事件 * * @param view */ @OnClick({R.id.tv_back, R.id.tv_right, R.id.sendIv, R.id.menu_red, R.id.fab1, R.id.fab2, R.id.fab3, R.id.fab4, R.id.fab5}) public void onClick(View view) { switch (view.getId()) { case R.id.tv_back: finish(); break; case R.id.tv_right: break; //评论 case R.id.sendIv: if (mPresenter != null) { //发布评论 String content = circleEt.getText().toString().trim(); if (TextUtils.isEmpty(content)) { ToastUitl.showToastWithImg("评论内容不能为空", R.drawable.ic_warm); return; } mPresenter.addComment(content, mCommentConfig); } updateEditTextBodyVisible(View.GONE, null); break; case R.id.menu_red: break; case R.id.fab1: menuRed.close(true); case R.id.fab2: menuRed.close(true); case R.id.fab3: menuRed.close(true); case R.id.fab4: menuRed.close(true); case R.id.fab5: menuRed.close(true); CirclePublishActivity.startAction(this); break; } } @OnLongClick({R.id.image_right}) public boolean onLongClick(View view) { switch (view.getId()) { case R.id.image_right: //发文字朋友圈 //CirclePublishActivity.startAction(this, false); break; } return false; } /***************************presenter回调*******************************************/ /** * 未读消息总数 * * @param count */ @Override public void updateNotReadNewsCount(int count, String icon) { zoneHeaderView.setNotReadMsgData(count, icon); } @Override public void setListData(List<CircleItem> circleItems, PageBean pageBean) { if (mAdapter.getPageBean().isRefresh()) { mAdapter.reset(circleItems); irc.setRefreshing(false); } else { mAdapter.addAll(circleItems); irc.setLoadMoreStatus(LoadMoreFooterView.Status.GONE); } //判断是否还可以加载更多 if (pageBean.getTotalPage() <= pageBean.getPage()) { irc.setLoadMoreStatus(LoadMoreFooterView.Status.THE_END); } //加载完成 if (mAdapter.getData().size() > 0) { loadedTip.setLoadingTip(LoadingTip.LoadStatus.finish); } else { loadedTip.setLoadingTip(LoadingTip.LoadStatus.empty); } } @Override public void setOnePublishData(CircleItem circleItem) { mAdapter.add(0, circleItem); } @Override public void update2DeleteCircle(String circleId, int position) { mAdapter.remove(position); } @Override public void update2AddFavorite(int circlePosition, FavortItem addItem) { if (addItem != null) { mAdapter.getData().get(circlePosition).getGoodjobs().add(addItem); mAdapter.notifyItemChanged(circlePosition); } } @Override public void update2DeleteFavort(int circlePosition, String userId) { List<FavortItem> items = mAdapter.getData().get(circlePosition).getGoodjobs(); for (int i = 0; i < items.size(); i++) { if (userId.equals(items.get(i).getUserId())) { items.remove(i); mAdapter.notifyItemChanged(circlePosition); return; } } } @Override public void update2AddComment(int circlePosition, CommentItem addItem) { if (addItem != null) { mAdapter.getData().get(circlePosition).getReplys().add(addItem); mAdapter.notifyItemChanged(circlePosition); } //清空评论文本 circleEt.setText(""); } @Override public void update2DeleteComment(int circlePosition, String commentId, int commentPosition) { List<CommentItem> items = mAdapter.getData().get(circlePosition).getReplys(); items.remove(commentPosition); mAdapter.notifyDataSetChanged(); //调接口情况建议用id判断删除 // for (int i = 0; i < items.size(); i++) { // if (commentId.equals(items.get(i).getId())) { // items.remove(i); // mAdapter.notifyDataSetChanged(); // return; // } // } } @Override public void updateEditTextBodyVisible(int visibility, CommentConfig commentConfig) { mCommentConfig = commentConfig; editTextBodyLl.setVisibility(visibility); measureCircleItemHighAndCommentItemOffset(commentConfig); if (commentConfig != null && CommentConfig.Type.REPLY.equals(commentConfig.getCommentType())) { circleEt.setHint("回复" + commentConfig.getName() + ":"); } else { circleEt.setHint("说点什么吧"); } if (View.VISIBLE == visibility) { circleEt.requestFocus(); //弹出键盘 KeyBordUtil.showSoftKeyboard(circleEt); //隐藏菜单 menuRed.hideMenuButton(true); } else if (View.GONE == visibility) { //隐藏键盘 KeyBordUtil.hideSoftKeyboard(circleEt); //显示菜单 menuRed.showMenuButton(true); } } /** * 测量偏移量 * * @param commentConfig * @return */ private int getListviewOffset(CommentConfig commentConfig) { if (commentConfig == null) return 0; //这里如果你的listview上面还有其它占高度的控件,则需要减去该控件高度,listview的headview除外。 int listviewOffset = mScreenHeight - mSelectCircleItemH - mCurrentKeyboardH - mEditTextBodyHeight - ntb.getMeasuredHeight(); if (commentConfig.commentType == CommentConfig.Type.REPLY) { //回复评论的情况 listviewOffset = listviewOffset + mSelectCommentItemOffset - ntb.getMeasuredHeight(); } return listviewOffset; } private void measureCircleItemHighAndCommentItemOffset(CommentConfig commentConfig) { if (commentConfig == null) return; int headViewCount = irc.getHeaderContainer().getChildCount(); //当前选中的view int selectPostion = commentConfig.circlePosition + headViewCount + 1; View selectCircleItem = linearLayoutManager.findViewByPosition(selectPostion); if (selectCircleItem != null) { mSelectCircleItemH = selectCircleItem.getHeight() - DisplayUtil.dip2px(48); //获取评论view,计算出该view距离所属动态底部的距离 if (commentConfig.commentType == CommentConfig.Type.REPLY) { //回复评论的情况 CommentListView commentLv = (CommentListView) selectCircleItem.findViewById(R.id.commentList); if (commentLv != null) { //找到要回复的评论view,计算出该view距离所属动态底部的距离 View selectCommentItem = commentLv.getChildAt(commentConfig.commentPosition); if (selectCommentItem != null) { //选择的commentItem距选择的CircleItem底部的距离 mSelectCommentItemOffset = 0; View parentView = selectCommentItem; do { int subItemBottom = parentView.getBottom(); parentView = (View) parentView.getParent(); if (parentView != null) { mSelectCommentItemOffset += (parentView.getHeight() - subItemBottom); } } while (parentView != null && parentView != selectCircleItem); } } } } } @Override public void showLoading(String title) { loadedTip.setLoadingTip(LoadingTip.LoadStatus.loading); } @Override public void stopLoading() { //listviewFrame.refreshComplete(); loadedTip.setLoadingTip(LoadingTip.LoadStatus.finish); } @Override public void showErrorTip(String msg) { //listviewFrame.refreshComplete(); loadedTip.setLoadingTip(LoadingTip.LoadStatus.error); loadedTip.setTips(msg); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { if (editTextBodyLl != null && editTextBodyLl.getVisibility() == View.VISIBLE) { editTextBodyLl.setVisibility(View.GONE); return true; } } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { super.onDestroy(); } }