MyFollowPresenter.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package com.edufound.reader.presenter;
  2. import android.content.Intent;
  3. import android.graphics.Rect;
  4. import android.os.Build;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Toast;
  8. import com.edufound.reader.activity.OthersRecordActivity;
  9. import com.edufound.reader.adapter.MyFollowItemAdapter;
  10. import com.edufound.reader.base.BaseActivity;
  11. import com.edufound.reader.base.BasePresenter;
  12. import com.edufound.reader.bean.HttpResultBean;
  13. import com.edufound.reader.bean.HttpResultDataListBean;
  14. import com.edufound.reader.bean.MyFollowBean;
  15. import com.edufound.reader.bean.UserRecordBean;
  16. import com.edufound.reader.contract.MyFollowContract;
  17. import com.edufound.reader.listener.RecyclerItemClickListener;
  18. import com.edufound.reader.model.MyFollowModel;
  19. import com.edufound.reader.util.SizeUtils;
  20. import com.google.gson.reflect.TypeToken;
  21. import com.jakewharton.rxbinding4.view.RxView;
  22. import com.okhttplib.HttpInfo;
  23. import com.okhttplib.callback.Callback;
  24. import com.orhanobut.logger.Logger;
  25. import java.io.IOException;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. import androidx.annotation.RequiresApi;
  29. import androidx.recyclerview.widget.GridLayoutManager;
  30. import androidx.recyclerview.widget.LinearLayoutManager;
  31. import androidx.recyclerview.widget.RecyclerView;
  32. import io.reactivex.rxjava3.annotations.NonNull;
  33. public class MyFollowPresenter extends BasePresenter<MyFollowContract.View> implements MyFollowContract.Presenter {
  34. MyFollowModel mModel;
  35. List<MyFollowBean> mDataList;
  36. MyFollowItemAdapter myFollowItemAdapter;
  37. int mPageIndex = 1;
  38. int mTotalSize = 0;
  39. boolean loadOver = false;
  40. int toNextPosition = 0;
  41. public MyFollowPresenter() {
  42. mModel = new MyFollowModel();
  43. // mDataList = new ArrayList<>();
  44. // for (int i = 0; i < 30; i++) {
  45. // mDataList.add("i=" + i);
  46. // }
  47. }
  48. @RequiresApi(api = Build.VERSION_CODES.M)
  49. @Override
  50. public void initRecyclerView(RecyclerView rv) {
  51. if (mDataList == null || mDataList.size() <= 0) {
  52. mView.getNoFollow().setVisibility(View.VISIBLE);
  53. rv.setVisibility(View.GONE);
  54. return;
  55. }
  56. mView.getNoFollow().setVisibility(View.GONE);
  57. rv.setVisibility(View.VISIBLE);
  58. myFollowItemAdapter = new MyFollowItemAdapter(mView.getActivity(), mDataList);
  59. GridLayoutManager gridLayoutManager = new GridLayoutManager(mView.getActivity(), 3);
  60. gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  61. gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
  62. @Override
  63. public int getSpanSize(int position) {
  64. return (myFollowItemAdapter.isHeaderView(position) || myFollowItemAdapter.isBottomView(position)) ? gridLayoutManager.getSpanCount() : 1;
  65. }
  66. });
  67. rv.addItemDecoration(new MyFollowItemDecoration(
  68. SizeUtils.dp2px(mView.getActivity(), 27f),
  69. SizeUtils.dp2px(mView.getActivity(), 27f)));
  70. rv.setLayoutManager(gridLayoutManager);
  71. rv.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
  72. @Override
  73. public void onChildViewAttachedToWindow(@androidx.annotation.NonNull View view) {
  74. }
  75. @Override
  76. public void onChildViewDetachedFromWindow(@androidx.annotation.NonNull View view) {
  77. }
  78. });
  79. myFollowItemAdapter.setOnItemClickListener(new RecyclerItemClickListener() {
  80. @Override
  81. public void onClickListener(int position, View view, Object object) {
  82. toNextPosition = position;
  83. Bundle bundle = new Bundle();
  84. bundle.putString("intoPage", "MyFollowActivity");
  85. bundle.putString("other_uid", mDataList.get(position).getUserInfo().getUser().getUid());
  86. ((BaseActivity) mView.getActivity()).toNextActivityForResult(OthersRecordActivity.class, bundle, MyFollowModel.OTHERPAGE_BACK);
  87. }
  88. });
  89. rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
  90. @Override
  91. public void onScrollStateChanged(@androidx.annotation.NonNull RecyclerView recyclerView, int newState) {
  92. super.onScrollStateChanged(recyclerView, newState);
  93. addMoreData(rv);
  94. }
  95. });
  96. rv.setAdapter(myFollowItemAdapter);
  97. }
  98. @Override
  99. public void getFollowAll() {
  100. Logger.e("getFollowAll");
  101. if (mDataList != null && mDataList.size() >= mTotalSize) {
  102. loadOver = true;
  103. Toast.makeText(mView.getActivity(), "没有更多了", Toast.LENGTH_SHORT).show();
  104. return;
  105. }
  106. mModel.getFollowAll(mView.getActivity(), mPageIndex, new Callback() {
  107. @Override
  108. public void onSuccess(HttpInfo info) throws IOException {
  109. HttpResultBean<HttpResultDataListBean<MyFollowBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<MyFollowBean>>>() {
  110. }.getType());
  111. if (mDataList == null || mDataList.size() <= 0) {
  112. mDataList = bean.getData().getList();
  113. mTotalSize = Integer.valueOf(bean.getData().getTotalSize());
  114. mView.getFollowSuccess();
  115. } else {
  116. mDataList.addAll(bean.getData().getList());
  117. mView.getRootView().post(new Runnable() {
  118. @Override
  119. public void run() {
  120. myFollowItemAdapter.notifyDataSetChanged();
  121. }
  122. });
  123. mPageIndex++;
  124. }
  125. }
  126. @Override
  127. public void onFailure(HttpInfo info) throws IOException {
  128. }
  129. });
  130. }
  131. @Override
  132. public void activityForResult(Intent intent, int resultCode) {
  133. }
  134. @Override
  135. public int getToNextPosition() {
  136. return toNextPosition;
  137. }
  138. @Override
  139. public void removeItemByPosition(int position) {
  140. myFollowItemAdapter.removeData(position);
  141. if (mTotalSize > 0) {
  142. mTotalSize--;
  143. } else {
  144. mView.getNoFollow().setVisibility(View.VISIBLE);
  145. }
  146. }
  147. private void addMoreData(RecyclerView rv) {
  148. //获取当前显示的View 的数据
  149. int childCount = rv.getChildCount();
  150. //获取最后一具 Item 对应的View
  151. View childAt = rv.getChildAt(childCount - 1);
  152. //获取当前军舰中显示的最后一个 Item 的位置 Postion
  153. int childLayoutPosition = rv.getChildLayoutPosition(childAt);
  154. //如果不是最后一个就向下滑动
  155. if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) {
  156. } else {
  157. if (loadOver) {
  158. return;
  159. }
  160. getFollowAll();
  161. }
  162. }
  163. }
  164. class MyFollowItemDecoration extends RecyclerView.ItemDecoration {
  165. private int mRowSpacing;//行间距
  166. private int mColumnSpacing;// 列间距
  167. /**
  168. * @param rowSpacing 行间距
  169. * @param columnSpacing 列间距
  170. */
  171. public MyFollowItemDecoration(int rowSpacing, int columnSpacing) {
  172. this.mRowSpacing = rowSpacing;
  173. this.mColumnSpacing = columnSpacing;
  174. }
  175. @Override
  176. public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
  177. int position = parent.getChildAdapterPosition(view);
  178. outRect.bottom = mRowSpacing;
  179. outRect.right = mColumnSpacing;
  180. if (position < 3) {
  181. outRect.left = mColumnSpacing;
  182. }
  183. }
  184. }