package com.yuyh.sprintnba.ui;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.support.design.widget.AppBarLayout;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.github.clans.fab.FloatingActionButton;
import com.github.clans.fab.FloatingActionMenu;
import com.yuyh.library.utils.DimenUtils;
import com.yuyh.library.utils.toast.ToastUtils;
import com.yuyh.sprintnba.R;
import com.yuyh.sprintnba.app.Constant;
import com.yuyh.sprintnba.base.BaseSwipeBackCompatActivity;
import com.yuyh.sprintnba.http.bean.forum.ForumsData;
import com.yuyh.sprintnba.http.bean.forum.ThreadListData;
import com.yuyh.sprintnba.support.OnListItemClickListener;
import com.yuyh.sprintnba.support.SpaceItemDecoration;
import com.yuyh.sprintnba.support.SupportRecyclerView;
import com.yuyh.sprintnba.ui.adapter.ThreadListAdapter;
import com.yuyh.sprintnba.ui.presenter.impl.ThreadListPresenterImpl;
import com.yuyh.sprintnba.ui.view.ThreadListView;
import com.yuyh.sprintnba.utils.FrescoUtils;
import java.util.ArrayList;
import java.util.List;
import butterknife.InjectView;
import butterknife.OnClick;
/**
* @author yuyh.
* @date 16/6/11.
*/
public class ThreadListActivity extends BaseSwipeBackCompatActivity
implements ThreadListView, AppBarLayout.OnOffsetChangedListener {
public static final String INTENT_FORUM = "forum";
public static final String INTENT_FORUM_ID = "boardID";
public static void start(Context context, ForumsData.Forum data) {
Intent intent = new Intent(context, ThreadListActivity.class);
intent.putExtra(INTENT_FORUM, data);
context.startActivity(intent);
}
public static void start(Context context, String forumId) {
Intent intent = new Intent(context, ThreadListActivity.class);
intent.putExtra(INTENT_FORUM_ID, forumId);
context.startActivity(intent);
}
public ForumsData.Forum forum;
public String boardId;
@InjectView(R.id.lmrvLoadMore)
SupportRecyclerView recyclerView;
LinearLayoutManager linearLayoutManager;
@InjectView(R.id.backdrop)
SimpleDraweeView backdrop;
@InjectView(R.id.tvSubTitle)
TextView tvSubTitle;
@InjectView(R.id.toolbar)
Toolbar toolbar;
@InjectView(R.id.appbar)
AppBarLayout appbar;
@InjectView(R.id.refreshLayout)
SwipeRefreshLayout refreshLayout;
@InjectView(R.id.floatingAttention)
FloatingActionButton floatingAttention;
@InjectView(R.id.floatingPost)
FloatingActionButton floatingPost;
@InjectView(R.id.floatingSwitch)
FloatingActionButton floatingSwitch;
@InjectView(R.id.floatingRefresh)
FloatingActionButton floatingRefresh;
@InjectView(R.id.floatingMenu)
FloatingActionMenu floatingMenu;
private ThreadListAdapter adapter;
private List<ThreadListData.ThreadInfo> list = new ArrayList<>();
private ThreadListPresenterImpl presenter;
private String last = "";
private int pageIndex = 1;
private String key;
private String type = Constant.THREAD_TYPE_NEW;
private boolean isLoading;
private SearchView searchView;
@Override
protected int getContentViewLayoutID() {
statusBarCompat = false;
return R.layout.activity_thread_list;
}
@Override
protected void initViewsAndEvents() {
forum = (ForumsData.Forum) getIntent().getSerializableExtra(INTENT_FORUM);
boardId = getIntent().getStringExtra(INTENT_FORUM_ID);
appbar.addOnOffsetChangedListener(this);
if (forum == null) {
presenter = new ThreadListPresenterImpl(boardId, this, this);
presenter.getForumInfo();
} else {
presenter = new ThreadListPresenterImpl(forum.fid, this, this);
boardId = forum.fid;
showThreadInfo(forum);
}
//backdrop.setImageDrawable(getResources().getDrawable(R.drawable.nba_default_large));
initToolbar(toolbar);
presenter.initialized();
presenter.onThreadReceive(type, "", true);
initRecyclerView();
}
private void initRecyclerView() {
linearLayoutManager = new LinearLayoutManager(recyclerView.getContext());
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new SpaceItemDecoration(DimenUtils.dpToPxInt(3)));
recyclerView.setHasFixedSize(true);
refreshLayout.setOnRefreshListener(new RefreshListener());
refreshLayout.setColorSchemeColors(ContextCompat.getColor(this, R.color.material_red));
adapter = new ThreadListAdapter(list, this, R.layout.item_list_threads);
adapter.setOnItemClickListener(new OnListItemClickListener<ThreadListData.ThreadInfo>() {
@Override
public void onItemClick(View view, int position, ThreadListData.ThreadInfo data) {
ThreadDetailActivity.start(mContext, "", data.tid, 1, data.fid);
}
});
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new RefreshListener());
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset == 0 || verticalOffset == -appBarLayout.getTotalScrollRange()) {
refreshLayout.setEnabled(true);
} else {
refreshLayout.setEnabled(false);
}
}
@Override
public void showThreadList(List<ThreadListData.ThreadInfo> forumInfoList, boolean isRefresh) {
last = forumInfoList.get(forumInfoList.size() - 1).tid;
if (isRefresh) {
list.clear();
last = "";
}
list.addAll(forumInfoList);
adapter.notifyDataSetChanged();
if (searchView != null)
searchView.clearFocus();
}
@Override
public void showThreadInfo(ForumsData.Forum forum) {
if (forum != null) {
toolbar.setTitle(forum.name);
backdrop.setController(FrescoUtils.getController(forum.backImg, backdrop));
tvSubTitle.setText(forum.description);
}
}
@Override
public void onFloatingVisibility(int visibility) {
floatingMenu.setVisibility(visibility);
}
@Override
public void showLoading(String msg) {
showLoadingDialog();
}
@Override
public void hideLoading() {
hideLoadingDialog();
complete();
}
@Override
public void showError(String msg) {
hideLoadingDialog();
ToastUtils.showSingleToast(msg);
}
@Override
public void onLoadCompleted(boolean hasMore) {
isLoading = false;
}
@Override
public void onRefreshCompleted() {
refreshLayout.setRefreshing(false);
}
private class RefreshListener extends RecyclerView.OnScrollListener implements SwipeRefreshLayout.OnRefreshListener {
@Override
public void onRefresh() {
pageIndex = 0;
presenter.onThreadReceive(type, "", true);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
if (lastVisibleItemPosition + 1 == adapter.getItemCount()) { // 滑到倒数第二项就加载更多
boolean isRefreshing = refreshLayout.isRefreshing();
if (isRefreshing) {
adapter.notifyItemRemoved(adapter.getItemCount());
return;
}
if (!isLoading) {
isLoading = true;
if (presenter.loadType == ThreadListPresenterImpl.TYPE_LIST)
presenter.onThreadReceive(type, last, false);
else {
pageIndex++;
presenter.onStartSearch(key, pageIndex, false);
}
}
}
}
}
private void complete() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
hideLoadingDialog();
}
}, 1000);
}
@Override
public void onBackPressed() {
if (floatingMenu.isOpened()) {
floatingMenu.close(true);
return;
}
super.onBackPressed();
}
@Override
public void onScrollToTop() {
recyclerView.smoothScrollToPosition(0);
}
@OnClick(R.id.floatingAttention)
void floatingAttention() {
presenter.onAttentionClick();
floatingMenu.toggle(true);
}
@OnClick(R.id.floatingPost)
void floatingPost() {
floatingMenu.toggle(true);
PostActivity.startForResult(this, "", Constant.TYPE_POST, boardId, "", "", 1);
}
@OnClick(R.id.floatingRefresh)
void floatingRefresh() {
presenter.onRefresh();
floatingMenu.toggle(true);
}
@OnClick(R.id.floatingSwitch)
void floatingSwitch() {
if (floatingSwitch.getLabelText().equals("按回帖时间排序")) {
presenter.onThreadReceive(Constant.THREAD_TYPE_HOT, "", true);
type = Constant.THREAD_TYPE_HOT;
floatingSwitch.setLabelText("按发帖时间排序");
} else {
presenter.onThreadReceive(Constant.THREAD_TYPE_NEW, "", true);
type = Constant.THREAD_TYPE_NEW;
floatingSwitch.setLabelText("按回帖时间排序");
}
floatingMenu.toggleMenuButton(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_thread, menu);
MenuItem menuItem = menu.findItem(R.id.action_search);//在菜单中找到对应控件的item
searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
presenter.onStartSearch(query, 1, true);
key = query;
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
MenuItemCompat.setOnActionExpandListener(menuItem,
new MenuItemCompat.OnActionExpandListener() {//设置打开关闭动作监听
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
presenter.onThreadReceive(Constant.THREAD_TYPE_HOT, "", true);
return true;
}
});
return true;
}
}