package com.edufound.reader.presenter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.view.View; import com.edufound.reader.activity.SmallFullVideoActivity; import com.edufound.reader.adapter.MyCollectionItemAdapter; import com.edufound.reader.base.BaseActivity; import com.edufound.reader.base.BasePresenter; import com.edufound.reader.bean.HttpResultBean; import com.edufound.reader.bean.HttpResultDataListBean; import com.edufound.reader.bean.UserRecordBean; import com.edufound.reader.contract.MyCollectionContract; import com.edufound.reader.listener.RecyclerItemClickListener; import com.edufound.reader.model.MyCollectionModel; import com.edufound.reader.receiver.BackPageReceiver; import com.edufound.reader.util.MMKVUtil; import com.edufound.reader.util.SizeUtils; import com.google.gson.reflect.TypeToken; import com.okhttplib.HttpInfo; import com.okhttplib.callback.Callback; import com.orhanobut.logger.Logger; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import androidx.annotation.RequiresApi; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import io.reactivex.rxjava3.annotations.NonNull; public class MyCollectionPresenter extends BasePresenter implements MyCollectionContract.Presenter { List mDataList; MyCollectionItemAdapter myCollectionItemAdapter; MyCollectionModel mModel; int mTotalSize = 0; int mPageIndex = 1; boolean loadOver = false; boolean rvAdditemDecoration = false; //需要删除的position Map mRemovMap; public MyCollectionPresenter() { mRemovMap = new HashMap<>(); mModel = new MyCollectionModel(); } @Override public void initRecyclerView(RecyclerView rv) { if (mDataList == null || mDataList.size() <= 0) { mView.getNoCollectionImg().setVisibility(View.VISIBLE); rv.setVisibility(View.GONE); return; } mView.getNoCollectionImg().setVisibility(View.GONE); rv.setVisibility(View.VISIBLE); myCollectionItemAdapter = new MyCollectionItemAdapter(mView.getActivity(), mDataList); GridLayoutManager gridLayoutManager = new GridLayoutManager(mView.getActivity(), 2); gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); if (!rvAdditemDecoration) { rv.addItemDecoration(new MyCollectionItemDecoration( SizeUtils.dp2px(mView.getActivity(), 27f), SizeUtils.dp2px(mView.getActivity(), 27f))); rvAdditemDecoration = true; } rv.setLayoutManager(gridLayoutManager); rv.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(@androidx.annotation.NonNull View view) { } @Override public void onChildViewDetachedFromWindow(@androidx.annotation.NonNull View view) { } }); myCollectionItemAdapter.setOnItemClickListener(new RecyclerItemClickListener() { @Override public void onClickListener(int position, View view, Object object) { Bundle bundle = new Bundle(); bundle.putString("index", position + ""); bundle.putString("dataJson", "getmmkv"); bundle.putString("intoPage", "MyCollection"); //数据太多了。直接传不过去,通过MMKV写一下再读一下 MMKVUtil.getInstance().encode("video_data", ((BaseActivity) mView.getActivity()).getGson().toJson(mDataList)); // bundle.putString("dataJson", ((BaseActivity) mView.getActivity()).getGson().toJson(mDataList)); // ((BaseActivity) mView.getActivity()).toNextActivity(SmallFullVideoActivity.class, bundle); ((BaseActivity) mView.getActivity()).toNextActivityForResult(SmallFullVideoActivity.class, bundle, MyCollectionModel.ACTIVITY_BACK_RESULT); } }); rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@androidx.annotation.NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); addMoreData(rv); } }); rv.setAdapter(myCollectionItemAdapter); } @Override public void getFavoritesData() { if (mDataList != null && mDataList.size() >= mTotalSize) { loadOver = true; // Toast.makeText(mView.getActivity(), "没有更多了", Toast.LENGTH_SHORT).show(); return; } mModel.getFavorites(mView.getActivity(), mPageIndex, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean> bean = info.getRetDetail(new TypeToken>>() { }.getType()); if (mDataList == null || mDataList.size() <= 0) { mDataList = bean.getData().getList(); mTotalSize = Integer.valueOf(bean.getData().getTotalSize()); mView.getFavoritesSuccess(); } else { mDataList.addAll(bean.getData().getList()); mView.getRootView().post(new Runnable() { @Override public void run() { myCollectionItemAdapter.notifyDataSetChanged(); } }); } mPageIndex++; } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("获取收藏列表失败:" + info.getRetDetail()); } }); } @Override public void activityDestory() { mView.getActivity().unregisterReceiver(collectionReceiver); } @Override public void activityOnStart() { Logger.e("注册广播"); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM); intentFilter.addAction(BackPageReceiver.BACK_HOME_ADD_VIDEO_ITEM); mView.getActivity().registerReceiver(collectionReceiver, intentFilter); // IntentFilter intentFilter = new IntentFilter(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM); // mView.getActivity().registerReceiver(receiver, intentFilter); } BroadcastReceiver collectionReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM)) { //删除item int position = Integer.valueOf(intent.getStringExtra("position")); Logger.e("删除item:" + position + ",添加到map里"); mRemovMap.put("del" + position, position); } else if (intent.getAction().equals(BackPageReceiver.BACK_HOME_ADD_VIDEO_ITEM)) { //添加item int position = Integer.valueOf(intent.getStringExtra("position")); Logger.e("添加item:" + position + ",从需要遍历的map里删除"); if (mRemovMap.get("del" + position) != null) { mRemovMap.remove("del" + position); } } } }; @Override public void clearData() { mDataList = null; myCollectionItemAdapter = null; mTotalSize = 0; mPageIndex = 1; loadOver = false; } @RequiresApi(api = Build.VERSION_CODES.N) @Override public void activityOnResume() { if (mRemovMap != null && mRemovMap.size() > 0) { mRemovMap.forEach((key, value) -> { if (myCollectionItemAdapter != null) { myCollectionItemAdapter.removeByPosition(value); } }); mRemovMap = new HashMap<>(); } } public void addMoreData(RecyclerView rv) { //获取当前显示的View 的数据 int childCount = rv.getChildCount(); //获取最后一具 Item 对应的View View childAt = rv.getChildAt(childCount - 1); //获取当前军舰中显示的最后一个 Item 的位置 Postion int childLayoutPosition = rv.getChildLayoutPosition(childAt); //如果不是最后一个就向下滑动 if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) { } else { if (loadOver) { return; } getFavoritesData(); } } } class MyCollectionItemDecoration extends RecyclerView.ItemDecoration { private int mRowSpacing;//行间距 private int mColumnSpacing;// 列间距 /** * @param rowSpacing 行间距 * @param columnSpacing 列间距 */ public MyCollectionItemDecoration(int rowSpacing, int columnSpacing) { this.mRowSpacing = rowSpacing; this.mColumnSpacing = columnSpacing; } @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); outRect.bottom = mRowSpacing; outRect.right = mColumnSpacing; if (position < 2) { outRect.left = mColumnSpacing; } } }