实现效果图:
右边为可左右滑动的展示相册的布局。 实现方式: ViewPager+RecycleView 接下来,正文开始: 1、activity.xml
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp_media"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tv_time"
android:layout_marginTop="@dimen/dimen_10"
android:layout_toEndOf="@+id/card_menu" />
2、VeiwPagerAdapter.java
public class ViewPagerAdapter extends PagerAdapter {
private List<View> mViewList;
public ViewPagerAdapter(List<View> mViewList) {
this.mViewList = mViewList;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return (mViewList.get(position));
}
@Override
public int getCount() {
return mViewList == null ? 0 : mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
3、Activity.java
public class PreviewActivity2 extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = PreviewActivity2.class.getSimpleName();
private RecyclerView mediaRecyclerView;
private ViewPager mediaPager;
private RecyclerViewAdapter recyclerViewAdapter;
private TextView emptyView;
private TextView photoTv;
private TextView videoTv;
private ArrayList<String> deniedPermission = new ArrayList<>();
private static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
private static final int PERMISSION_CODE = 1000;
/**
* 默认展示的是照片
*/
private boolean isShowPhoto = true;
/**
* 数据源
*/
private List<File> srcfiles = new ArrayList<>();
/**
* 图片文件
*/
private List<File> picFiles;
/**
* 视频文件
*/
private List<File> videoFiles;
private static final int MIN = 0;
private static int MAX = 7;
private LayoutInflater inflater;
private List<View> mPagerList;
/**
* 总的页数
*/
private int pageCount;
/**
* 一页显示的数量
*/
private int pageSize = 10;
/**
* 当前显示的是第几页
*/
private int curIndex = 0;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preview3);
initView();
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_CODE);
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_CODE) {
deniedPermission.clear();
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int result = grantResults[i];
if (result != PackageManager.PERMISSION_GRANTED) {
deniedPermission.add(permission);
}
}
if (deniedPermission.isEmpty()) {
initData();
} else {
new AlertDialog.Builder(this)
.setMessage(getString(R.string.capture_permission_message))
.setNegativeButton(getString(R.string.capture_permission_no), (dialog, which) -> {
dialog.dismiss();
finish();
})
.setPositiveButton(getString(R.string.capture_permission_ok), (dialog, which) -> {
String[] denied = new String[deniedPermission.size()];
ActivityCompat.requestPermissions(PreviewActivity2.this, deniedPermission.toArray(denied), PERMISSION_CODE);
}).create().show();
}
}
}
private void initView() {
emptyView = findViewById(R.id.emptyview);
mediaPager = findViewById(R.id.vp_media);
photoTv = findViewById(R.id.tv_photo);
videoTv = findViewById(R.id.tv_video);
photoTv.setSelected(true);
videoTv.setSelected(false);
photoTv.setOnClickListener(this);
videoTv.setOnClickListener(this);
}
@RequiresApi(api = Build.VERSION_CODES.N)
private void initData() {
List<File> allMediaFile = FileUtils.listFileSortByModifyTime(FileUtils.PHOTO_PATH);
videoFiles = FileUtils.isVideo(allMediaFile);
// 取差集
picFiles = allMediaFile.stream().filter(item -> !videoFiles.contains(item)).collect(toList());
inflater = LayoutInflater.from(this);
pageCount = (int) Math.ceil(picFiles.size() * 1.0 / pageSize);
final List<View> viewList = new ArrayList<>();
for (int i = 0; i < pageCount; i++) {
RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.item_viewpager, mediaPager, false);
GridLayoutManager manager = new GridLayoutManager(this, 5);
recyclerView.setLayoutManager(manager);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, picFiles, i, pageSize);
recyclerView.setAdapter(adapter);
viewList.add(recyclerView);
}
ViewPagerAdapter adapter = new ViewPagerAdapter(viewList);
mediaPager.setAdapter(adapter);
}
@Override
public void onClick(View view) {
int viewId = view.getId();
if (viewId == R.id.tv_photo) {
photoTv.setSelected(true);
videoTv.setSelected(false);
isShowPhoto = true;
} else if (viewId == R.id.tv_video) {
photoTv.setSelected(false);
videoTv.setSelected(true);
isShowPhoto = false;
}
setData();
}
private void setData() {
srcfiles.clear();
if (isShowPhoto) {
srcfiles.addAll(picFiles);
} else {
srcfiles.addAll(videoFiles);
}
if (recyclerViewAdapter != null) {
recyclerViewAdapter.notifyDataSetChanged();
}
}
}
4、RecycleViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {
private Context context;
private List<File> files;
/**
* 页数下标,从0开始(通俗讲第几页)
*/
private int mIndex;
/**
* 每页显示最大条目个数
*/
private int mPageSize;
private OnRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
public void setOnItemClickListener(OnRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
public RecyclerViewAdapter(Context context, List<File> files, int index, int pageSize) {
this.context = context;
this.files = files;
this.mPageSize = pageSize;
this.mIndex = index;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_recyclerview_item, parent, false);
view.setOnClickListener(this);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final int pos = position + mIndex * mPageSize;
File file = files.get(pos);
Glide.with(context).load(Uri.fromFile(file)).into(holder.icon);
if (FileUtils.isVideo(file)) {
holder.playStateImg.setVisibility(View.VISIBLE);
} else {
holder.playStateImg.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return files.size() > (mIndex + 1) * mPageSize ? mPageSize : (files.size() - mIndex * mPageSize);
}
@Override
public long getItemId(int position) {
return position + mIndex * mPageSize;
}
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null) {
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView icon, playStateImg;
public ViewHolder(@NonNull View itemView) {
super(itemView);
icon = itemView.findViewById(R.id.icon);
playStateImg = itemView.findViewById(R.id.playstate);
}
}
public interface OnRecyclerViewItemClickListener {
/**
* item 点击
*
* @param parent 父布局
* @param view view
* @param position position
*/
void onItemClick(RecyclerView parent, View view, int position);
}
}