最近因为项目需求,需要做一个QQ聊天界面里边的相册功能,那是个什么功能?难道和微信不一样???试了一下,厉害了,我的哥,竟然可以滑动选择图片,这是咋弄的,还可以这么玩,好奇!!!必须给整出来,就算没有这个需求了,也要整出来,所有意思啊
百度,Google,找了半天,只有一篇,CSDN上边有一篇http://blog.csdn.net/chendong_/article/details/52473160,就是这个了,还有github上边也有一篇,https://github.com/chendongMarch/SlidingCheckSample,应该是同一个人的,毕竟项目名字是一样的,其他的没注意看,不管他,下载下来看看再说
虽然有点出入吧,但是大体上基本没错,运行效果
演示视频
大体就是这样子的了,但是博主就说明了一下他的framelayout是怎么重写的,那么我再补充些,在activity里边是怎么运行的吧,也便于以后再有这个需求的时候,能有个地方查找到,更容易入手
package com.march.slidingchecksample;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.march.quickrvlibs.RvViewHolder;
import com.march.quickrvlibs.SimpleRvAdapter;
import com.march.quickrvlibs.inter.OnClickListener;
import com.march.quickrvlibs.inter.OnLongClickListener;
import com.march.slidingselect.SlidingSelectLayout;
import java.util.ArrayList;
import java.util.List;
/**
* 直接集成activity,然后添加方法 各种初始化 也是可以的,但是可能是博主为了对6.0进行兼容,所以进行了大量封装
* 但是有用佮只有本来的几个方法,最后边的三个方法 基本没用, 前提是SDK版本必须是22以下(包含22)
*/
public class MainActivity extends MyBaseActivity {
private RecyclerView mRv;
private SlidingSelectLayout mScl;
private List<Demo> demos;
private int size;
private float spanCount = 4f;
private SimpleRvAdapter<Demo> adapter;
/***
* 初始化数据
*/
@Override
protected void onInitDatas() {
super.onInitDatas();
/**(getResources().getDisplayMetrics().widthPixels获取屏幕宽度*/
//屏幕的偏移量 是屏幕的1/4 因为recyclerview的gridview布局里边每行有四个item,所以偏移量是屏幕的1/4,
//如果每行有三个item 则spanCount = 1f;
size = (int) (getResources().getDisplayMetrics().widthPixels / spanCount);
demos = new ArrayList<>();
for (int i = 0; i < 50; i++) {
demos.add(new Demo(i, "this is " + i));
}
}
/***
* 初始化view
* @param save
*/
@Override
protected void onInitViews(final Bundle save) {
super.onInitViews(save);
mRv = getView(R.id.recyclerview);
mScl = getView(R.id.scl);
/**展示recyclerview为gridview类型 布局填充器**/
mRv.setLayoutManager(new GridLayoutManager(mContext, (int) spanCount));
createAdapter();
}
/***
* 滑动监听事件
*/
@Override
protected void onInitEvents() {
super.onInitEvents();
/**滑动选择事件*/
mScl.setOnSlidingSelectListener(new SlidingSelectLayout.OnSlidingSelectListener<Demo>() {
@Override
public void onSlidingSelect(int pos, View parentView, Demo data) {
//滑动选中之后,修改集合的数据为true 默认值为false 因为没有设置类型 则取默认值
/***获取item是否选中*/
demos.get(pos).isChanged = !demos.get(pos).isChanged;
/**更改item*/
/**notifyItemChanged表示在集合里边的数据发生改变的时候,更改本item的变化*/
adapter.notifyItemChanged(pos);
}
});
}
/***
* 初始化适配器
*/
private void createAdapter() {
/**simpleRvAdapter相当于simpleadapter,同样是适配器的一种**/
adapter = new SimpleRvAdapter<Demo>(mContext, demos, R.layout.item_rv) {
@Override
public void onBindView(RvViewHolder holder, Demo data, int pos, int type) {
ViewGroup.LayoutParams lp = holder.getParentView().getLayoutParams();
lp.width = size;
lp.height = size;
TextView tv = (TextView) holder.getView(R.id.content);
if (data.isChanged) {
tv.setTextColor(Color.RED);
tv.setText("change " + data.desc);
} else {
tv.setTextColor(Color.WHITE);
tv.setText(data.desc);
}
/**设置settag,至于没有gettag,博主已经在重写的framelayout里边写完了*/
mScl.markView(holder.getParentView(), pos, data);
}
};
adapter.setOnChildClickListener(new OnClickListener<Demo>() {
@Override
public void onItemClick(int pos, RvViewHolder holder, Demo data) {
data.isChanged = !data.isChanged;
/**notifyItemChanged表示在集合里边的数据发生改变的时候,更改本item的变化*/
adapter.notifyItemChanged(pos);
}
});
/**此方法可以忽略,如果只想做一个界面,博主只是为了展示一个效果*/
adapter.setOnItemLongClickListener(new OnLongClickListener<Demo>() {
@Override
public void onItemLongClick(int pos, RvViewHolder holder, Demo data) {
startActivity(new Intent(mContext, ItemHeaderRuleActivity.class));
}
});
mRv.setAdapter(adapter);
}
/***
* 添加布局 创建布局
* @return
*/
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
/**
* 没有权限
* @return
*/
@Override
protected String[] getPermission2Check() {
return new String[0];
}
/***
* 是否显示titleBar 返回false 则隐藏titleBar
* @return
*/
@Override
protected boolean isInitTitle() {
return false;
}
}
具体代码,注释已写好,说下需要注意的地方,as开发人员需要在项目的build.gradle里边 添加下边的代码
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
}
然后更新,花费时间会很长,基本五到十分钟吧,在下载的时候,你可以先看下上百年的代码注释,还有一个地方需要注意,因为博主已经兼容了6.0,自然监听权限的框架肯定是少不了的,所以呢,SDK版本号,就必须改成23了
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
至于在哪里修改,应该不用我说了吧,不知道的百度吧。
在项目app的build.gradle里边还需要添加两个包
compile 'com.march.quickrvlibs:quickrvlibs:2.1.3'
compile 'com.march.baselib:baselib:0.0.1'
我记得需要改动的就这些了,嗯,如果还有忘记的,欢迎补充。