/* * Copyright 2016 Freelander * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jun.elephant.ui.topic.list; import android.content.res.Resources; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import com.jun.elephant.R; import com.jun.elephant.entity.topic.TopicEntity; import com.jun.elephant.entity.topic.TopicListEntity; import com.jun.elephant.mvpframe.base.BaseFrameFragment; import com.jun.elephant.global.Constants; import com.jun.elephant.ui.topic.publish.TopicPublishActivity; import com.jun.elephant.ui.adapter.TopicListAdapter; import com.jun.elephant.ui.widget.MultiStateView; import com.jun.elephant.ui.widget.MySwipeRefreshLayout; import com.melnykov.fab.FloatingActionButton; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import cn.bingoogolapple.badgeview.BGABadgeRelativeLayout; import in.srain.cube.views.ptr.PtrDefaultHandler2; import in.srain.cube.views.ptr.PtrFrameLayout; /** * Created by Jun on 2016/7/9. */ public class TopicListByForumFragment extends BaseFrameFragment<TopicPresenter, TopicModel> implements TopicContract.View { @Bind(R.id.recyclerView) RecyclerView mRecyclerView; @Bind(R.id.swipe_layout) MySwipeRefreshLayout mSwipeLayout; @Bind(R.id.multiStateView) MultiStateView mMultiStateView; @Bind(R.id.fab) FloatingActionButton mFabBtn; private TopicListAdapter mAdapter; private List<TopicEntity> mTopicList; public String TYPE = Constants.Topic.EXCELLENT; private int mPageIndex = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_topic_list); ButterKnife.bind(this, getContentView()); } @Override public void initData() { super.initData(); mTopicList = new ArrayList<>(); mAdapter = new TopicListAdapter(getContext(), mTopicList); } @Override public void initView() { super.initView(); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setAdapter(mAdapter); } @Override public void initListener() { super.initListener(); mFabBtn.attachToRecyclerView(mRecyclerView); mSwipeLayout.setPtrHandler(new PtrDefaultHandler2() { @Override public void onLoadMoreBegin(PtrFrameLayout ptrFrameLayout) { mPageIndex++; mPresenter.getTopicListByForum(TYPE, mPageIndex); } @Override public void onRefreshBegin(PtrFrameLayout ptrFrameLayout) { mPageIndex = 1; mPresenter.getTopicListByForum(TYPE, mPageIndex); } }); mFabBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getUserConstant().isLogin()) { openActivity(TopicPublishActivity.class); } else { showShortToast("先登录..."); } } }); } @Override public void initLoad() { super.initLoad(); // mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); getData(); } public void getData() { int state = mMultiStateView.getViewState(); if (state == MultiStateView.VIEW_STATE_EMPTY || state == MultiStateView.VIEW_STATE_ERROR) { mPageIndex = 1; mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); mPresenter.getTopicListByForum(TYPE, mPageIndex); return; } mSwipeLayout.post(new Runnable() { @Override public void run() { mSwipeLayout.autoRefresh(); } }); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } @Override public void refreshTopicList(TopicListEntity topicListEntity) { if (topicListEntity.getData().size() == 0) { mMultiStateView.setViewState(MultiStateView.VIEW_STATE_EMPTY); return; } mTopicList.clear(); mTopicList.addAll(topicListEntity.getData()); mAdapter.notifyDataSetChanged(); mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } @Override public void loadMoreTopicList(final TopicListEntity topicListEntity) { List<TopicEntity> temp = topicListEntity.getData(); if (temp.size() != 0) { mTopicList.addAll(temp); mAdapter.notifyDataSetChanged(); } } @Override public void onRequestStart() { } @Override public void onRequestEnd() { mSwipeLayout.refreshComplete(); } @Override public void onRequestError(String msg) { super.onRequestError(msg); mMultiStateView.setViewState(MultiStateView.VIEW_STATE_ERROR); } public void refreshUI() { TypedValue badgeColor = new TypedValue(); TypedValue floatBtnColor = new TypedValue(); Resources.Theme theme = getContext().getTheme(); theme.resolveAttribute(R.attr.elephantBadge, badgeColor, true); theme.resolveAttribute(R.attr.elephantFloatBtn, floatBtnColor, true); int childCount = mRecyclerView.getChildCount(); for (int childIndex = 0; childIndex < childCount; childIndex++) { ViewGroup childView = (ViewGroup) mRecyclerView.getChildAt(childIndex); BGABadgeRelativeLayout bgarl = (BGABadgeRelativeLayout) childView.findViewById(R.id.bgaRl); bgarl.getBadgeViewHelper().setBadgeBgColorInt(ContextCompat.getColor(getContext(), badgeColor.resourceId)); } mFabBtn.setColorNormalResId(floatBtnColor.resourceId); mFabBtn.setColorPressedResId(floatBtnColor.resourceId); //让 RecyclerView 缓存在 Pool 中的 Item 失效 //那么,如果是ListView,要怎么做呢?这里的思路是通过反射拿到 AbsListView 类中的 RecycleBin 对象,然后同样再用反射去调用 clear 方法 Class<RecyclerView> recyclerViewClass = RecyclerView.class; try { Field declaredField = recyclerViewClass.getDeclaredField("mRecycler"); declaredField.setAccessible(true); Method declaredMethod = Class.forName(RecyclerView.Recycler.class.getName()).getDeclaredMethod("clear", (Class<?>[]) new Class[0]); declaredMethod.setAccessible(true); declaredMethod.invoke(declaredField.get(mRecyclerView), new Object[0]); RecyclerView.RecycledViewPool recycledViewPool = mRecyclerView.getRecycledViewPool(); recycledViewPool.clear(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }