package com.likebamboo.osa.android.ui; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.AbsListView; import com.likebamboo.osa.android.R; import com.likebamboo.osa.android.entity.BlogList; import com.likebamboo.osa.android.impl.BaseOnItemClickListener; import com.likebamboo.osa.android.request.RequestParams; import com.likebamboo.osa.android.ui.adapter.BlogAdapter; import com.likebamboo.osa.android.ui.adapter.ChoiceAdapter; import com.likebamboo.osa.android.ui.fragments.BlogInfoFragment; import com.orm.StringUtil; import java.lang.reflect.Field; import java.util.ArrayList; /** * 收藏界面 * * @author likebamboo * @since 2015-06-08 */ public class FavoriteActivity extends BlogListActivity { /** * 收藏或者取消收藏Action。 */ public static final String ACTION_FAVORITE_ADD_OR_REMOVE = "com.likebamboo.osa.android.favorite.ACTION_ADD_OR_REMOVE"; /** * 收藏或者取消收藏。 */ public static final String EXTRA_FAVORITE_ADD_OR_REMOVE = "extra_favorite_add_or_remove"; /** * 是否处于编辑模式 */ private boolean isEditMode = false; private BroadcastReceiver mFavReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (isFinishing() || intent == null || !ACTION_FAVORITE_ADD_OR_REMOVE.equals(intent.getAction()) || !intent.hasExtra(BlogInfoFragment.EXTRA_BLOG)) { return; } BlogList.Blog blog = null; try { blog = intent.getParcelableExtra(BlogInfoFragment.EXTRA_BLOG); } catch (Exception e) { e.printStackTrace(); } if (blog == null || !(mAdapter instanceof BlogAdapter)) { return; } boolean add = intent.getBooleanExtra(EXTRA_FAVORITE_ADD_OR_REMOVE, false); // 删除收藏 mAdapter.removeData(blog); // 如果是添加收藏 if (add) { // 先移除旧数据, 然后再添加数据 mAdapter.addData(blog, 0); } mAdapter.notifyDataSetChanged(); // 如果数据为空 if (mAdapter.getCount() <= 0) { mLoadingLayout.showEmpty(getString(R.string.donot_have_any_favorite)); } } }; /** * 多选监听 */ private AbsListView.MultiChoiceModeListener multiChoiceModeListener = null; /** * */ private Field mChoiceActionMode = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { registerReceiver(mFavReceiver, new IntentFilter(ACTION_FAVORITE_ADD_OR_REMOVE)); } catch (Exception e) { e.printStackTrace(); } // 多选模式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { initChoiceListener(); } } /** * 初始化与多选相关 */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void initChoiceListener() { mBlogListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); /** * StaggeredGridView的缺陷把我害惨了啊。 * https://github.com/etsy/AndroidStaggeredGrid/issues/77 * The StaggeredGridView does not support the following: * Item selector drawables * Item long press event * Scroll bars * Row dividers * Edge effect * Fading edge * Overscroll */ // 多选监听回调 multiChoiceModeListener = new AbsListView.MultiChoiceModeListener() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean choice) { if (mAdapter instanceof ChoiceAdapter) { ((ChoiceAdapter) mAdapter).setItemSelected(position, choice); } if (mBlogListView.getCheckedItemCount() == 0 && actionMode != null) { actionMode.finish(); } } @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { // actionmode的菜单处理 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.edit, menu); setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); isEditMode = true; return true; } @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; } @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) { switch (item.getItemId()) { case R.id.nav_contextual_action_check_all: // 全选 or 取消全选 if (!(mAdapter instanceof ChoiceAdapter)) { return false; } int selected = ((ChoiceAdapter) mAdapter).getSelectedCount(); // 如果已经全选 if (selected == mAdapter.getCount()) { // 取消全选 setAllItemCheckState(false); } else { // 全选 setAllItemCheckState(true); } break; case R.id.nav_contextual_action_remove: // 删除收藏 // 删除选中 for (int i = 0; i < mBlogListView.getCount(); i++) { if (mBlogListView.isItemChecked(i)) { // 取消现有选中状态 try { mBlogListView.setItemChecked(i, false); } catch (Exception e) { //ignore } // 取消现有选中状态 ((ChoiceAdapter) mAdapter).setItemSelected(i, false); // 删除收藏的博客 BlogList.Blog blog = (BlogList.Blog) mAdapter.getItem(i); if (blog != null) { blog.delete(); } } } // 退出编辑状态 actionMode.finish(); // 重置 reset(); // 加载数据 loadDatas(); break; default: break; } return true; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onDestroyActionMode(ActionMode actionMode) { isEditMode = false; setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); // 有可能是按back键或者title back 退出编辑模式的 if (mBlogListView.getCheckedItemCount() > 0) { setAllItemCheckState(false); } } }; ((BlogAdapter) mAdapter).setOnItemClickListener(new BaseOnItemClickListener<BlogList.Blog>() { @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onItemClick(int position, BlogList.Blog item) { if (isEditMode) { flipItemCheckState(position); return; } // 进入博客详情界面 goToBlogDetail(item); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onItemLongClick(int position, BlogList.Blog item) { if (item == null) { return; } flipItemCheckState(position); } }); mBlogListView.setMultiChoiceModeListener(multiChoiceModeListener); } /** * 反转所有项选中的状态 * * @param select */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void setAllItemCheckState(boolean select) { for (int i = 0; i < mAdapter.getCount(); i++) { try { // StaggeredGridView setItemChecked 莫名报空指针异常。 mBlogListView.setItemChecked(i, select); } catch (NullPointerException e) { // ignore } } // 设置adapter选中状态 ((BlogAdapter) mAdapter).setSelectedAll(select); } /** * 反转某一项选中的状态 * * @param position */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void flipItemCheckState(int position) { try { boolean checked = mBlogListView.isItemChecked(position); try { // StaggeredGridView setItemChecked 莫名报空指针异常。 mBlogListView.setItemChecked(position, !checked); } catch (NullPointerException e) { // 多选回调 if (multiChoiceModeListener != null) { //获得对象所有属性 if (mChoiceActionMode == null) { mChoiceActionMode = AbsListView.class.getDeclaredField("mChoiceActionMode"); } if (mChoiceActionMode != null) { mChoiceActionMode.setAccessible(true); Object value = mChoiceActionMode.get(mBlogListView); if (value instanceof ActionMode) { multiChoiceModeListener.onItemCheckedStateChanged((ActionMode) value, position, position, !checked); } } } } } catch (Exception e) { e.printStackTrace(); } } @Override protected void loadDatas(RequestParams params) { if (isRefreshing) { mPageIndex = 0; } // 加载本地数据 BlogList list = new BlogList(); ArrayList<BlogList.Blog> blogs = BlogList.Blog.listPage(mPageIndex, mPageSize, StringUtil.toSQLName("favTime") + " desc "); list.setList(blogs); if (blogs == null || blogs.isEmpty()) { list.setMessage(getString(R.string.donot_have_any_favorite)); mAdapter.notifyDataSetChanged(); } isLoading = false; mLoadingLayout.showLoading(false); // 如果是刷新数据 if (isRefreshing) { // 清空现有数据 reset(); // 停止刷新 stopRefresh(); } doOnSuccess(list); } @Override public void addParams(RequestParams params) { } @Override public String getRequestUrl() { return ""; } @Override public boolean hasFilterFooter() { return false; } @Override protected void onDestroy() { super.onDestroy(); try { unregisterReceiver(mFavReceiver); } catch (Exception e) { e.printStackTrace(); } } }