Android实现横向滑动的卡片网格式布局

231 阅读2分钟

实现效果图:

微信图片_20210906102355.jpg 右边为可左右滑动的展示相册的布局。 实现方式: 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);
    }
}