Skip to content

Commit

Permalink
使用RecyclerView替换GridView
Browse files Browse the repository at this point in the history
  • Loading branch information
nanchen2251 committed Apr 5, 2017
1 parent 9d67000 commit ca3ccce
Show file tree
Hide file tree
Showing 5 changed files with 248 additions and 14 deletions.
3 changes: 2 additions & 1 deletion imagepicker/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ android {
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.github.chrisbanes.photoview:library:1.2.4'
compile 'com.android.support:recyclerview-v7:25.1.1'
}

//apply from: '../bintray.gradle'
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,6 @@ public void takePicture(Activity activity, int requestCode) {
// 如果没有指定uri,则data就返回有数据!

Uri uri;

if (VERSION.SDK_INT <= VERSION_CODES.M){
uri = Uri.fromFile(takeImageFile);
}else{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
package com.lzy.imagepicker.adapter;

import android.Manifest;
import android.app.Activity;
import android.support.v4.app.ActivityCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.Toast;

import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.R;
import com.lzy.imagepicker.bean.ImageItem;
import com.lzy.imagepicker.ui.ImageBaseActivity;
import com.lzy.imagepicker.ui.ImageGridActivity;
import com.lzy.imagepicker.util.Utils;
import com.lzy.imagepicker.view.SuperCheckBox;

import java.util.ArrayList;

/**
* 加载相册图片的RecyclerView适配器
*
* 用于替换原项目的GridView,使用局部刷新解决选中照片出现闪动问题
*
* 替换为RecyclerView后并没有通过局部刷新解决,可能是picasso图片加载框架的问题
*
* Author: nanchen
* Email: liushilin520@foxmail.com
* Date: 2017-04-05 10:04
*/

public class ImageRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> {


private static final int ITEM_TYPE_CAMERA = 0; //第一个条目是相机
private static final int ITEM_TYPE_NORMAL = 1; //第一个条目不是相机
private ImagePicker imagePicker;
private Activity mActivity;
private ArrayList<ImageItem> images; //当前需要显示的所有的图片数据
private ArrayList<ImageItem> mSelectedImages; //全局保存的已经选中的图片数据
private boolean isShowCamera; //是否显示拍照按钮
private int mImageSize; //每个条目的大小
private LayoutInflater mInflater;
private OnImageItemClickListener listener; //图片被点击的监听

public void setOnImageItemClickListener(OnImageItemClickListener listener) {
this.listener = listener;
}

public interface OnImageItemClickListener {
void onImageItemClick(View view, ImageItem imageItem, int position);
}

public void refreshData(ArrayList<ImageItem> images) {
if (images == null || images.size() == 0) this.images = new ArrayList<>();
else this.images = images;
notifyDataSetChanged();
}

/**
* 构造方法
*/
public ImageRecyclerAdapter(Activity activity, ArrayList<ImageItem> images) {
this.mActivity = activity;
if (images == null || images.size() == 0) this.images = new ArrayList<>();
else this.images = images;

mImageSize = Utils.getImageItemWidth(mActivity);
imagePicker = ImagePicker.getInstance();
isShowCamera = imagePicker.isShowCamera();
mSelectedImages = imagePicker.getSelectedImages();
mInflater = LayoutInflater.from(activity);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_CAMERA){
return new CameraViewHolder(mInflater.inflate(R.layout.adapter_camera_item,parent,false));
}
return new ImageViewHolder(mInflater.inflate(R.layout.adapter_image_list_item,parent,false));
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (holder instanceof CameraViewHolder){
((CameraViewHolder)holder).bindCamera();
}else if (holder instanceof ImageViewHolder){
((ImageViewHolder)holder).bind(position);
}
}

@Override
public int getItemViewType(int position) {
if (isShowCamera) return position == 0 ? ITEM_TYPE_CAMERA : ITEM_TYPE_NORMAL;
return ITEM_TYPE_NORMAL;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public int getItemCount() {
return isShowCamera ? images.size() + 1 : images.size();
}

public ImageItem getItem(int position) {
if (isShowCamera) {
if (position == 0) return null;
return images.get(position - 1);
} else {
return images.get(position);
}
}

private class ImageViewHolder extends ViewHolder{

View rootView;
ImageView ivThumb;
View mask;
SuperCheckBox cbCheck;

ImageViewHolder(View itemView) {
super(itemView);
rootView = itemView;
ivThumb = (ImageView) itemView.findViewById(R.id.iv_thumb);
mask = itemView.findViewById(R.id.mask);
cbCheck = (SuperCheckBox) itemView.findViewById(R.id.cb_check);
itemView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mImageSize)); //让图片是个正方形
}

void bind(final int position){
final ImageItem imageItem = getItem(position);
ivThumb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) listener.onImageItemClick(rootView, imageItem, position);
}
});
cbCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int selectLimit = imagePicker.getSelectLimit();
if (cbCheck.isChecked() && mSelectedImages.size() >= selectLimit) {
Toast.makeText(mActivity.getApplicationContext(), mActivity.getString(R.string.select_limit, selectLimit), Toast.LENGTH_SHORT).show();
cbCheck.setChecked(false);
mask.setVisibility(View.GONE);
} else {
imagePicker.addSelectedImageItem(position, imageItem, cbCheck.isChecked());
mask.setVisibility(View.VISIBLE);
}
}
});
//根据是否多选,显示或隐藏checkbox
if (imagePicker.isMultiMode()) {
cbCheck.setVisibility(View.VISIBLE);
boolean checked = mSelectedImages.contains(imageItem);
if (checked) {
mask.setVisibility(View.VISIBLE);
cbCheck.setChecked(true);
} else {
mask.setVisibility(View.GONE);
cbCheck.setChecked(false);
}
} else {
cbCheck.setVisibility(View.GONE);
}
imagePicker.getImageLoader().displayImage(mActivity, imageItem.path, ivThumb, mImageSize, mImageSize); //显示图片
}

}

private class CameraViewHolder extends ViewHolder{

View mItemView;

CameraViewHolder(View itemView) {
super(itemView);
mItemView = itemView;
}

void bindCamera(){
mItemView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mImageSize)); //让图片是个正方形
mItemView.setTag(null);
mItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!((ImageBaseActivity) mActivity).checkPermission(Manifest.permission.CAMERA)) {
ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CAMERA}, ImageGridActivity.REQUEST_PERMISSION_CAMERA);
} else {
imagePicker.takePicture(mActivity, ImagePicker.REQUEST_CODE_TAKE);
}
}
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,25 @@
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;

import com.lzy.imagepicker.util.BitmapUtil;
import com.lzy.imagepicker.DataHolder;
import com.lzy.imagepicker.ImageDataSource;
import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.R;
import com.lzy.imagepicker.adapter.ImageFolderAdapter;
import com.lzy.imagepicker.adapter.ImageGridAdapter;
import com.lzy.imagepicker.adapter.ImageRecyclerAdapter;
import com.lzy.imagepicker.adapter.ImageRecyclerAdapter.OnImageItemClickListener;
import com.lzy.imagepicker.bean.ImageFolder;
import com.lzy.imagepicker.bean.ImageItem;
import com.lzy.imagepicker.util.BitmapUtil;
import com.lzy.imagepicker.view.FolderPopUpWindow;

import java.io.File;
Expand All @@ -47,7 +50,7 @@
*
* ================================================
*/
public class ImageGridActivity extends ImageBaseActivity implements ImageDataSource.OnImagesLoadedListener, ImageGridAdapter.OnImageItemClickListener, ImagePicker.OnImageSelectedListener, View.OnClickListener {
public class ImageGridActivity extends ImageBaseActivity implements ImageDataSource.OnImagesLoadedListener, OnImageItemClickListener, ImagePicker.OnImageSelectedListener, View.OnClickListener {

public static final int REQUEST_PERMISSION_STORAGE = 0x01;
public static final int REQUEST_PERMISSION_CAMERA = 0x02;
Expand All @@ -64,9 +67,10 @@ public class ImageGridActivity extends ImageBaseActivity implements ImageDataSou
private ImageFolderAdapter mImageFolderAdapter; //图片文件夹的适配器
private FolderPopUpWindow mFolderPopupWindow; //ImageSet的PopupWindow
private List<ImageFolder> mImageFolders; //所有的图片文件夹
private ImageGridAdapter mImageGridAdapter; //图片九宫格展示的适配器
// private ImageGridAdapter mImageGridAdapter; //图片九宫格展示的适配器
private boolean directPhoto = false; // 默认不是直接调取相机

private RecyclerView mRecyclerView;
private ImageRecyclerAdapter mRecyclerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -90,6 +94,10 @@ protected void onCreate(Bundle savedInstanceState) {
}
}


mRecyclerView = (RecyclerView) findViewById(R.id.recycler);


findViewById(R.id.btn_back).setOnClickListener(this);
mBtnOk = (Button) findViewById(R.id.btn_ok);
mBtnOk.setOnClickListener(this);
Expand All @@ -107,8 +115,9 @@ protected void onCreate(Bundle savedInstanceState) {
mBtnPre.setVisibility(View.GONE);
}

mImageGridAdapter = new ImageGridAdapter(this, null);
// mImageGridAdapter = new ImageGridAdapter(this, null);
mImageFolderAdapter = new ImageFolderAdapter(this, null);
mRecyclerAdapter = new ImageRecyclerAdapter(this,null);

onImageSelected(0, null, false);

Expand Down Expand Up @@ -194,7 +203,8 @@ public void onItemClick(AdapterView<?> adapterView, View view, int position, lon
mFolderPopupWindow.dismiss();
ImageFolder imageFolder = (ImageFolder) adapterView.getAdapter().getItem(position);
if (null != imageFolder) {
mImageGridAdapter.refreshData(imageFolder.images);
// mImageGridAdapter.refreshData(imageFolder.images);
mRecyclerAdapter.refreshData(imageFolder.images);
mBtnDir.setText(imageFolder.name);
}
mGridView.smoothScrollToPosition(0);//滑动到顶部
Expand All @@ -207,10 +217,19 @@ public void onItemClick(AdapterView<?> adapterView, View view, int position, lon
public void onImagesLoaded(List<ImageFolder> imageFolders) {
this.mImageFolders = imageFolders;
imagePicker.setImageFolders(imageFolders);
if (imageFolders.size() == 0) mImageGridAdapter.refreshData(null);
else mImageGridAdapter.refreshData(imageFolders.get(0).images);
mImageGridAdapter.setOnImageItemClickListener(this);
mGridView.setAdapter(mImageGridAdapter);
if (imageFolders.size() == 0) {
// mImageGridAdapter.refreshData(null);
mRecyclerAdapter.refreshData(null);
}
else{
// mImageGridAdapter.refreshData(imageFolders.get(0).images);
mRecyclerAdapter.refreshData(imageFolders.get(0).images);
}
// mImageGridAdapter.setOnImageItemClickListener(this);
// mGridView.setAdapter(mImageGridAdapter);
mRecyclerAdapter.setOnImageItemClickListener(this);
mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
mRecyclerView.setAdapter(mRecyclerAdapter);
mImageFolderAdapter.refreshData(imageFolders);
}

Expand Down Expand Up @@ -263,7 +282,8 @@ public void onImageSelected(int position, ImageItem item, boolean isAdd) {
mBtnPre.setEnabled(false);
}
mBtnPre.setText(getResources().getString(R.string.preview_count, imagePicker.getSelectImageCount()));
mImageGridAdapter.notifyDataSetChanged();
// mImageGridAdapter.notifyDataSetChanged();
mRecyclerAdapter.notifyItemChanged(position);
}

@Override
Expand Down
11 changes: 11 additions & 0 deletions imagepicker/src/main/res/layout/activity_image_g