package com.luck.picture.lib.ui; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SimpleItemAnimator; import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; import com.luck.picture.lib.R; import com.luck.picture.lib.adapter.PictureAlbumDirectoryAdapter; import com.luck.picture.lib.decoration.RecycleViewDivider; import com.luck.picture.lib.model.FunctionConfig; import com.luck.picture.lib.model.PictureConfig; import com.luck.picture.lib.observable.ImagesObservable; import com.luck.picture.lib.observable.ObserverListener; import com.yalantis.ucrop.entity.EventEntity; import com.yalantis.ucrop.entity.LocalMedia; import com.yalantis.ucrop.entity.LocalMediaFolder; import com.yalantis.ucrop.rxbus2.RxBus; import com.yalantis.ucrop.rxbus2.Subscribe; import com.yalantis.ucrop.rxbus2.ThreadMode; import com.yalantis.ucrop.util.ToolbarUtil; import com.yalantis.ucrop.util.Utils; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * author:luck * project:PictureSelector * package:com.luck.picture.ui * email:893855882@qq.com * data:16/12/31 */ public class PictureAlbumDirectoryActivity extends PictureBaseActivity implements View.OnClickListener, PictureAlbumDirectoryAdapter.OnItemClickListener, ObserverListener { private List<LocalMediaFolder> folders; private PictureAlbumDirectoryAdapter adapter; private RecyclerView recyclerView; private TextView tv_empty; private RelativeLayout rl_picture_title; private TextView picture_tv_title, picture_tv_right; private List<LocalMedia> selectMedias = new ArrayList<>(); @Subscribe(threadMode = ThreadMode.MAIN) public void eventBus(EventEntity obj) { switch (obj.what) { case FunctionConfig.CLOSE_FLAG: finish(); overridePendingTransition(0, R.anim.slide_bottom_out); break; } } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picture_activity_album); if (!RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().register(this); } selectMedias = (List<LocalMedia>) getIntent().getSerializableExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST); if (selectMedias == null) selectMedias = new ArrayList<>(); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); tv_empty = (TextView) findViewById(R.id.tv_empty); rl_picture_title = (RelativeLayout) findViewById(R.id.rl_picture_title); picture_tv_title = (TextView) findViewById(R.id.picture_tv_title); picture_tv_right = (TextView) findViewById(R.id.picture_tv_right); picture_tv_right.setTextColor(right_color); picture_tv_title.setTextColor(title_color); tv_empty.setOnClickListener(this); ImagesObservable.getInstance().add(this); switch (type) { case FunctionConfig.TYPE_IMAGE: picture_tv_title.setText(getString(R.string.picture_select_photo)); break; case FunctionConfig.TYPE_VIDEO: picture_tv_title.setText(getString(R.string.picture_select_video)); break; default: break; } ToolbarUtil.setColorNoTranslucent(this, statusBar); rl_picture_title.setBackgroundColor(backgroundColor); picture_tv_right.setText(getString(R.string.picture_cancel)); picture_tv_right.setOnClickListener(this); adapter = new PictureAlbumDirectoryAdapter(this); LinearLayoutManager manager = new LinearLayoutManager(this); ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.addItemDecoration(new RecycleViewDivider( mContext, LinearLayoutManager.HORIZONTAL, Utils.dip2px(this, 0.5f), ContextCompat.getColor(this, R.color.line_color))); recyclerView.setLayoutManager(manager); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(this); initData(); } /** * 初始化数据 */ protected void initData() { folders = ImagesObservable.getInstance().readLocalFolders(); if (folders.size() > 0) { tv_empty.setVisibility(View.GONE); adapter.bindFolderData(folders); notifyDataCheckedStatus(selectMedias); } else { tv_empty.setVisibility(View.VISIBLE); switch (type) { case FunctionConfig.TYPE_IMAGE: tv_empty.setText(getString(R.string.picture_no_photo)); break; case FunctionConfig.TYPE_VIDEO: tv_empty.setText(getString(R.string.picture_no_video)); break; default: break; } } } /** * 设置选中状态 */ private void notifyDataCheckedStatus(List<LocalMedia> medias) { try { // 获取选中图片 if (medias == null) { medias = new ArrayList<>(); } List<LocalMediaFolder> folders = adapter.getFolderData(); for (LocalMediaFolder folder : folders) { // 只重置之前有选中过的文件夹,因为有可能也取消选中的 if (folder.isChecked()) { folder.setCheckedNum(0); folder.setChecked(false); } } if (medias.size() > 0) { for (LocalMediaFolder folder : folders) { int num = 0;// 记录当前相册下有多少张是选中的 List<LocalMedia> images = folder.getImages(); for (LocalMedia media : images) { String path = media.getPath(); for (LocalMedia m : medias) { if (path.equals(m.getPath())) { num++; folder.setChecked(true); folder.setCheckedNum(num); } } } } } adapter.bindFolderData(folders); } catch (Exception e) { e.printStackTrace(); } } @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.tv_empty) { startEmptyImageActivity(); } else if (id == R.id.picture_tv_right) { finish(); overridePendingTransition(0, R.anim.slide_bottom_out); } } /** * */ private void startEmptyImageActivity() { List<LocalMedia> images = new ArrayList<>(); String title = ""; switch (type) { case FunctionConfig.TYPE_IMAGE: title = getString(R.string.picture_lately_image); break; case FunctionConfig.TYPE_VIDEO: title = getString(R.string.picture_lately_video); break; } startImageGridActivity(title, images); } @Override public void onItemClick(String folderName, List<LocalMedia> images) { if (images != null && images.size() > 0) { startImageGridActivity(folderName, images); } } private void startImageGridActivity(String folderName, final List<LocalMedia> images) { if (Utils.isFastDoubleClick()) { return; } Intent intent = new Intent(); List<LocalMediaFolder> folders = adapter.getFolderData(); ImagesObservable.getInstance().saveLocalMedia(images); ImagesObservable.getInstance().saveLocalFolders(folders); intent.putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectMedias); intent.putExtra(FunctionConfig.EXTRA_THIS_CONFIG, options); intent.putExtra(FunctionConfig.FOLDER_NAME, folderName); intent.putExtra(FunctionConfig.EXTRA_IS_TOP_ACTIVITY, true); intent.setClass(mContext, PictureImageGridActivity.class); startActivityForResult(intent, FunctionConfig.REQUEST_IMAGE); } @Override public void onBackPressed() { super.onBackPressed(); finish(); overridePendingTransition(0, R.anim.slide_bottom_out); } @Override protected void onDestroy() { super.onDestroy(); if (RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().unregister(this); } clearData(); } protected void clearData() { // 释放静态变量 PictureConfig.resultCallback = null; ImagesObservable.getInstance().remove(this); ImagesObservable.getInstance().clearLocalFolders(); ImagesObservable.getInstance().clearLocalMedia(); ImagesObservable.getInstance().clearSelectedLocalMedia(); } @Override public void observerUpFoldersData(List<LocalMediaFolder> folders) { this.folders = folders; initData(); } @Override public void observerUpSelectsData(List<LocalMedia> selectMedias) { folders = ImagesObservable.getInstance().readLocalFolders(); this.selectMedias = selectMedias; if (folders != null && folders.size() > 0) adapter.bindFolderData(folders); if (selectMedias == null) selectMedias = new ArrayList<>(); notifyDataCheckedStatus(selectMedias); if (tv_empty.getVisibility() == View.VISIBLE && adapter.getFolderData().size() > 0) tv_empty.setVisibility(View.GONE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == FunctionConfig.REQUEST_IMAGE) { if (resultCode == RESULT_OK) { List<LocalMedia> result = (List<LocalMedia>) data.getSerializableExtra(FunctionConfig.EXTRA_RESULT); setResult(RESULT_OK, new Intent().putExtra(FunctionConfig.EXTRA_RESULT, (Serializable) result)); finish(); } } } }