Skip to content

Commit

Permalink
1、新增支持更多的LayoutManager
Browse files Browse the repository at this point in the history
  • Loading branch information
FlyJingFish committed Jun 21, 2023
1 parent c20bf50 commit f00ea1a
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.flyjingfish.openimagelib.listener.OnPermissionsInterceptListener;
import com.flyjingfish.openimagelib.listener.OnSelectMediaListener;
import com.flyjingfish.openimagelib.listener.OnUpdateViewListener;
import com.flyjingfish.openimagelib.listener.LayoutManagerFindVisiblePosition;
import com.flyjingfish.openimagelib.listener.SourceImageViewGet;
import com.flyjingfish.openimagelib.listener.SourceImageViewIdGet;
import com.flyjingfish.openimagelib.listener.UpperLayerFragmentCreate;
Expand Down Expand Up @@ -119,20 +120,38 @@ public OpenImage setImageUrl(String openImageUrl, MediaType mediaType) {
}

/**
* 设置点击的ImageView所在容器
* 设置点击的 ImageView 所在的 RecyclerView 容器
*
* @param recyclerView 展示数据的RecyclerView
* @param sourceImageViewIdGet 展示数据的RecyclerView 的图片Id
* @return {@link OpenImage}
*/
public OpenImage setClickRecyclerView(RecyclerView recyclerView, SourceImageViewIdGet<OpenImageUrl> sourceImageViewIdGet) {
return setClickRecyclerView(recyclerView,null,sourceImageViewIdGet);
}

/**
* 设置点击的 ImageView 所在的 RecyclerView 容器<br/>
* 如果你使用了除 <br/>
* {@link androidx.recyclerview.widget.LinearLayoutManager}、<br/>
* {@link androidx.recyclerview.widget.GridLayoutManager}、<br/>
* {@link androidx.recyclerview.widget.StaggeredGridLayoutManager}<br/>
* 之外的{@link RecyclerView.LayoutManager},可在此设置 {@link LayoutManagerFindVisiblePosition} 并返回相应的参数即可,这样可以获得支持更多的自定义{@link RecyclerView.LayoutManager}
*
* @param recyclerView 展示数据的RecyclerView
* @param layoutManagerFindVisiblePosition 返回您自定义或三方库的 {@link RecyclerView.LayoutManager} 第一个和最后一个可见 Item 的位置
* @param sourceImageViewIdGet 展示数据的RecyclerView 的图片Id
* @return {@link OpenImage}
*/
public OpenImage setClickRecyclerView(RecyclerView recyclerView, LayoutManagerFindVisiblePosition layoutManagerFindVisiblePosition, SourceImageViewIdGet<OpenImageUrl> sourceImageViewIdGet) {
this.recyclerView = recyclerView;
this.layoutManagerFindVisiblePosition = layoutManagerFindVisiblePosition;
this.sourceImageViewIdGet = sourceImageViewIdGet;
return this;
}

/**
* 设置点击的ImageView所在容器
* 设置点击的 ImageView 所在的 ViewPager2 容器
*
* @param viewPager2 展示数据的ViewPager2
* @param sourceImageViewIdGet 展示数据的ViewPager2 的图片Id
Expand All @@ -145,7 +164,7 @@ public OpenImage setClickViewPager2(ViewPager2 viewPager2, SourceImageViewIdGet<
}

/**
* 设置点击的ImageView所在容器
* 设置点击的 ImageView 所在的 ViewPager 容器
*
* @param viewPager 展示数据的ViewPager
* @param sourceImageViewGet 展示数据的ViewPager 的图片ImageView
Expand All @@ -158,7 +177,7 @@ public OpenImage setClickViewPager(ViewPager viewPager, SourceImageViewGet<OpenI
}

/**
* 设置点击的ImageView所在容器
* 设置点击的 ImageView 所在的 GridView 容器
*
* @param gridView 展示数据的GridView
* @param sourceImageViewIdGet 展示数据的GridView 的图片Id
Expand All @@ -171,7 +190,7 @@ public OpenImage setClickGridView(GridView gridView, SourceImageViewIdGet<OpenIm
}

/**
* 设置点击的ImageView所在容器
* 设置点击的 ImageView 所在的 ListView 容器
*
* @param listView 展示数据的ListView
* @param sourceImageViewIdGet 展示数据的ListView 的图片Id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.flyjingfish.openimagelib.listener.OnExitListener;
import com.flyjingfish.openimagelib.listener.OnPermissionsInterceptListener;
import com.flyjingfish.openimagelib.listener.OnUpdateViewListener;
import com.flyjingfish.openimagelib.listener.LayoutManagerFindVisiblePosition;
import com.flyjingfish.openimagelib.listener.SourceImageViewGet;
import com.flyjingfish.openimagelib.listener.SourceImageViewIdGet;
import com.flyjingfish.openimagelib.utils.ActivityCompatHelper;
Expand All @@ -38,6 +39,7 @@ class OpenImage4Params {
protected final List<OpenImageUrl> openImageUrls = new ArrayList<>();
protected List<ImageView> imageViews;
protected RecyclerView recyclerView;
protected LayoutManagerFindVisiblePosition layoutManagerFindVisiblePosition;
protected AbsListView absListView;
protected ViewPager2 viewPager2;
protected ViewPager viewPager;
Expand Down Expand Up @@ -155,9 +157,6 @@ protected Intent inputIntentData() {
if (shapeScaleType != null){
intent.putExtra(OpenParams.SRC_SCALE_TYPE, shapeScaleType.ordinal());
}
// if (imageDiskMode != null){
// intent.putExtra(OpenParams.IMAGE_DISK_MODE, imageDiskMode.ordinal());
// }
intent.putExtra(OpenParams.ERROR_RES_ID, errorResId);
intent.putExtra(OpenParams.TOUCH_CLOSE_SCALE, OpenImageConfig.getInstance().getTouchCloseScale());
intent.putExtra(OpenParams.OPEN_IMAGE_STYLE, openImageStyle);
Expand Down Expand Up @@ -437,7 +436,10 @@ protected int[] getVisiblePosition() {
int firstPos = 0;
int lastPos = 0;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
if (layoutManagerFindVisiblePosition != null){
firstPos = layoutManagerFindVisiblePosition.findFirstVisibleItemPosition();
lastPos = layoutManagerFindVisiblePosition.findLastVisibleItemPosition();
}else if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
firstPos = linearLayoutManager.findFirstVisibleItemPosition();
lastPos = linearLayoutManager.findLastVisibleItemPosition();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,14 @@ public ShareExitViewBean onBack(int showPosition) {
}

RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (!(layoutManager instanceof LinearLayoutManager || layoutManager instanceof StaggeredGridLayoutManager)) {
throw new IllegalArgumentException("只支持使用继承自LinearLayoutManager和StaggeredGridLayoutManager的RecyclerView");
if (!(layoutManager instanceof LinearLayoutManager || layoutManager instanceof StaggeredGridLayoutManager || layoutManagerFindVisiblePosition != null)) {
throw new IllegalArgumentException("只支持使用继承自 LinearLayoutManager 和 StaggeredGridLayoutManager 的 RecyclerView,或在调用setClickRecyclerView时设置了 LayoutManagerFindVisiblePosition 接口");
}
srcViewType = SrcViewType.RV;

openImageDetails = new ArrayList<>();
viewPair = initShareView(openImageDetails);
if (checkIllegalException4ShareView(viewPair,"请确保是否调用了setClickPosition并且参数设置正确,或 SourceImageViewIdGet 返回的 ImageView 的Id正确")){
if (checkIllegalException4ShareView(viewPair,"请确保是否调用了 setClickPosition 并且参数设置正确,或 SourceImageViewIdGet 返回的 ImageView 的Id正确")){
return;
}
View shareViewClick = viewPair.first;
Expand Down Expand Up @@ -627,6 +627,7 @@ public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Ev
if (event == Lifecycle.Event.ON_DESTROY) {
context = null;
recyclerView = null;
layoutManagerFindVisiblePosition = null;
absListView = null;
viewPager = null;
viewPager2 = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.flyjingfish.openimagelib.enums;

public enum ImageShapeType {
RECTANGLE, OVAL;
RECTANGLE, OVAL
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
public enum MediaType {
IMAGE,
VIDEO,
NONE;//如果数据不是以上两种类型传这个
NONE//如果数据不是以上两种类型传这个
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.flyjingfish.openimagelib.listener;

import androidx.recyclerview.widget.RecyclerView;

/**
* 如果你的{@link androidx.recyclerview.widget.RecyclerView}设置了除以下三个<br/>
* {@link androidx.recyclerview.widget.LinearLayoutManager}、<br/>
* {@link androidx.recyclerview.widget.GridLayoutManager}、<br/>
* {@link androidx.recyclerview.widget.StaggeredGridLayoutManager}<br/>
* 之外的{@link androidx.recyclerview.widget.RecyclerView.LayoutManager},<br/>
* 你需要在{@link com.flyjingfish.openimagelib.OpenImage#setClickRecyclerView(RecyclerView, LayoutManagerFindVisiblePosition, SourceImageViewIdGet)}设置这个接口才可以,否则将会抛出异常
*/
public interface LayoutManagerFindVisiblePosition {
/**
* @return 返回 RecyclerView 在屏幕上第一个可见 Item 的位置
*/
int findFirstVisibleItemPosition();

/**
* @return 返回 RecyclerView 在屏幕上最后一个可见 Item 的位置
*/
int findLastVisibleItemPosition();
}
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,5 @@ dependencies {
implementation 'com.github.FlyJingFish:SwitchKeyboard:1.2.1'
implementation 'com.github.tbruyelle:rxpermissions:0.12'
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,29 @@
import com.flyjingfish.openimage.imageloader.MyImageLoader;
import com.flyjingfish.openimagelib.OpenImage;
import com.flyjingfish.openimagelib.OpenImageActivity;
import com.flyjingfish.openimagelib.beans.OpenImageUrl;
import com.flyjingfish.openimagelib.listener.OnPermissionsInterceptListener;
import com.flyjingfish.openimagelib.listener.OnRequestPermissionListener;
import com.flyjingfish.openimagelib.listener.LayoutManagerFindVisiblePosition;
import com.flyjingfish.openimagelib.listener.SourceImageViewIdGet;
import com.flyjingfish.openimagelib.transformers.ScaleInTransformer;
import com.flyjingfish.openimagelib.utils.ScreenUtils;
import com.google.android.flexbox.FlexDirection;
import com.google.android.flexbox.FlexWrap;
import com.google.android.flexbox.FlexboxLayoutManager;
import com.google.android.flexbox.JustifyContent;
import com.tbruyelle.rxpermissions3.RxPermissions;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class RecyclerViewActivity extends BaseActivity {

private ActivityRecyclerviewBinding binding;
private FlexboxLayoutManager customLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -70,6 +76,27 @@ protected void onCreate(Bundle savedInstanceState) {
loadData();
});

binding.btnC.setOnClickListener(v -> {
setSelect(4);
customLayoutManager = new FlexboxLayoutManager(this){
@Override
public RecyclerView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
if (lp instanceof RecyclerView.LayoutParams){
return new LayoutParams(lp);
}else if (lp instanceof ViewGroup.MarginLayoutParams){
return new LayoutParams(lp);
}else {
return new LayoutParams(lp);
}
}
};
customLayoutManager.setFlexWrap(FlexWrap.WRAP);
customLayoutManager.setFlexDirection(FlexDirection.ROW);
customLayoutManager.setJustifyContent(JustifyContent.FLEX_START);
binding.rv.rv.setLayoutManager(customLayoutManager);
loadData();
});

}

private int layoutType;
Expand All @@ -80,6 +107,7 @@ private void setSelect(int pos) {
binding.btnH.setSelected(pos == 1);
binding.btnG.setSelected(pos == 2);
binding.btnP.setSelected(pos == 3);
binding.btnC.setSelected(pos == 4);
}

private void loadData() {
Expand Down Expand Up @@ -111,16 +139,24 @@ private void setData(List<ImageEntity> datas) {

private class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyHolder> {
List<ImageEntity> datas;
int[] randoms ;

public RvAdapter(List<ImageEntity> datas) {
this.datas = datas;
randoms = new int[datas.size()];
for (int i = 0; i < datas.size(); i++) {
int random = 1 + new Random().nextInt(3);
randoms[i] = random;
}
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if (layoutType == 3) {
if (layoutType == 4) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_flex, parent, false);
}else if (layoutType == 3) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_staggered, parent, false);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_listview, parent, false);
Expand All @@ -130,29 +166,41 @@ public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
if (layoutType == 1) {
if (layoutType == 4) {
ViewGroup.LayoutParams layoutParams = holder.ivImage.getLayoutParams();
layoutParams.width = (int) ScreenUtils.dp2px(RecyclerViewActivity.this, 86 * randoms[position]);
holder.ivImage.setLayoutParams(layoutParams);
}else if (layoutType == 1) {
ViewGroup.LayoutParams layoutParams = holder.ivImage.getLayoutParams();
layoutParams.width = (int) ScreenUtils.dp2px(RecyclerViewActivity.this, 100);
layoutParams.height = (int) ScreenUtils.dp2px(RecyclerViewActivity.this, 100);
holder.ivImage.setLayoutParams(layoutParams);
} else if (layoutType == 0 || layoutType == 2) {
ViewGroup.LayoutParams layoutParams = holder.ivImage.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height = (int) ScreenUtils.dp2px(RecyclerViewActivity.this, 220);
holder.ivImage.setLayoutParams(layoutParams);
}
if (layoutType == 3) {
MyImageLoader.getInstance().load(holder.ivImage, datas.get(position).getCoverImageUrl(), R.mipmap.img_load_placeholder, R.mipmap.img_load_placeholder);
} else {
MyImageLoader.getInstance().load(holder.ivImage, datas.get(position).getCoverImageUrl(), R.mipmap.img_load_placeholder, R.mipmap.img_load_placeholder);

}
MyImageLoader.getInstance().load(holder.ivImage, datas.get(position).getCoverImageUrl(), R.mipmap.img_load_placeholder, R.mipmap.img_load_placeholder);
holder.ivImage.setOnClickListener(v -> {
OpenImage.with(RecyclerViewActivity.this).setClickRecyclerView(binding.rv.rv, new SourceImageViewIdGet() {
@Override
public int getImageViewId(OpenImageUrl data, int position) {
return R.id.iv_image;
}
}).setAutoScrollScanPosition(true)
.setSrcImageViewScaleType(ImageView.ScaleType.CENTER_CROP, true)
OpenImage openImage = OpenImage.with(RecyclerViewActivity.this);
if (layoutType == 4){
openImage.setClickRecyclerView(binding.rv.rv, new LayoutManagerFindVisiblePosition() {
@Override
public int findFirstVisibleItemPosition() {
return customLayoutManager.findFirstVisibleItemPosition();
}

@Override
public int findLastVisibleItemPosition() {
return customLayoutManager.findLastVisibleItemPosition();
}
}, (data, position1) -> R.id.iv_image);
}else {
openImage.setClickRecyclerView(binding.rv.rv, (data, position12) -> R.id.iv_image);
}
openImage.setAutoScrollScanPosition(true)
.setSrcImageViewScaleType(holder.ivImage.getScaleType(), true)
.setImageUrlList(datas)
.addPageTransformer(new ScaleInTransformer())
.setOpenImageStyle(R.style.DefaultPhotosTheme)
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/res/layout/activity_recyclerview.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@
android:textColor="@color/white"
android:background="@drawable/bg_title"
android:layout_weight="1"/>
<TextView
android:id="@+id/btn_c"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:text="自定义"
android:gravity="center"
android:textColor="@color/white"
android:background="@drawable/bg_title"
android:layout_weight="1"/>
</LinearLayout>
<include android:id="@+id/rv" layout="@layout/layout_recyclerview"/>
</LinearLayout>
11 changes: 11 additions & 0 deletions app/src/main/res/layout/item_flex.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:id="@+id/iv_image"
android:layout_height="120dp"
android:adjustViewBounds="true"
android:layout_margin="2dp"
android:scaleType="centerCrop">

</ImageView>

0 comments on commit f00ea1a

Please sign in to comment.