GridView是一个在二维可滚动的网格中展示内容的控件。网格中的内容通过使用adapter自动插入到布局中。
一、MainActivity
该类有几个重要的点
- 数据加载
private void getData() {
mUsers = new ArrayList<>();
EQ_Fault eq_fault1 = new EQ_Fault("1","111","a","b","c","d",true);
EQ_Fault eq_fault2 = new EQ_Fault("2","222","a","b","c","d",true);
EQ_Fault eq_fault3 = new EQ_Fault("3","333","a","b","c","d",true);
EQ_Fault eq_fault4 = new EQ_Fault("4","444","a","b","c","d",true);
EQ_Fault eq_fault5 = new EQ_Fault("5","555","a","b","c","d",true);
mUsers.add(eq_fault1);
mUsers.add(eq_fault2);
mUsers.add(eq_fault3);
mUsers.add(eq_fault4);
mUsers.add(eq_fault5);
//刷新适配器
gridviewAdapter.refresh(mUsers);
}
- 初始化适配器,同时设置操作模式
private void initGridview() {
//设置操作模式
Boolean isOperation = true;
gridviewAdapter = new Gridview_Adapter(this,isOperation,mOnGridviewListener);
gv_gridview.setAdapter(gridviewAdapter);
}
- 初始化触碰单击事件:实现组件显示和隐藏
@SuppressLint("ClickableViewAccessibility")
private void initListener() {
gv_gridview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
//判断当前是否是删除模式,如果是删除模式
if (gridviewAdapter.ismIsDeleteModel()){
//切换为非删除模式
gridviewAdapter.setmIsDeleteModel(false);
//刷新页面
gridviewAdapter.notifyDataSetChanged();
}
break;
}
return false;
}
});
}
二、Gridview_Adapter
- 加减号的组件添加
原理:首先添加“减号”(相当于放在0号位置),其次在0号位添加“加号”(相当于把减号位从0号位往右挤),从而达到我们想要的效果。
private void initUsers() {
EQ_Fault add = new EQ_Fault("add");
EQ_Fault delete = new EQ_Fault("delete");
mUsers.add(delete);
mUsers.add(0,add);
}
- 加减号的逻辑处理:有点绕,但理解了都是很简单的关系
final EQ_Fault user = mUsers.get(position);
if (mIsOperation){//可操作
if (position == ()-1){//减号的处理
/**
* 如果已经是删除模式,将减号隐藏,其他组件正常显示
*/
if (mIsDeleteModel){
view.setVisibility(View.INVISIBLE);//隐藏减号
}else {
view.setVisibility(View.VISIBLE);
/**
* View.VISIBLE--->可见
* View.INVISIBLE--->不可见,但这个View仍然会占用在xml文件中所分配的布局空间,不重新layout
* View.GONE---->不可见,但这个View在ViewGroup中不保留位置,会重新layout,不再占用空间,那后面的view就会取代他的位置
*/
viewHolder.iv_eq_photo.setImageResource(R.drawable.em_smiley_minus_btn_pressed);
viewHolder.iv_eq_delete.setVisibility(View.GONE);
viewHolder.tv_eq_name.setVisibility(View.INVISIBLE);
}
}else if (position == getCount()-2){//加号的处理
/**
* 如果已经是删除模式,将加号隐藏,其他组件正常显示
*/
//删除模式判断
if (mIsDeleteModel){
view.setVisibility(View.INVISIBLE);
}else {
view.setVisibility(View.VISIBLE);
viewHolder.iv_eq_photo.setImageResource(R.drawable.em_smiley_add_btn_pressed);
viewHolder.iv_eq_delete.setVisibility(View.GONE);
viewHolder.tv_eq_name.setVisibility(View.INVISIBLE);
}
}else {
view.setVisibility(View.VISIBLE);
viewHolder.tv_eq_name.setVisibility(View.VISIBLE);
viewHolder.tv_eq_name.setText(user.getEq_fault_id());
viewHolder.iv_eq_photo.setImageResource(R.drawable.eq);
if (mIsDeleteModel){
viewHolder.iv_eq_delete.setVisibility(View.VISIBLE);
}else {
viewHolder.iv_eq_delete.setVisibility(View.GONE);
}
}
//点击事件的处理
if (position == getCount() -1){//减号
viewHolder.iv_eq_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!mIsDeleteModel){//如果不是删除模式
//设置为删除模式
mIsDeleteModel = true;
//刷新页面
notifyDataSetChanged();
}
}
});
}else if (position == getCount() -2){//加号
viewHolder.iv_eq_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
monGridviewListener.onAddMembers();
}
});
}else {
viewHolder.iv_eq_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
monGridviewListener.onDeleteMember(user);
}
});
}
}else {//不可操作模式
if (position == getCount() -1 || position == getCount() - 2){
view.setVisibility(View.GONE);//隐藏加号和减号
}else {
view.setVisibility(View.VISIBLE);//其他组件显示
//名称
viewHolder.tv_eq_name.setText(user.getEq_fault_id());
//头像
viewHolder.iv_eq_photo.setImageResource(R.drawable.eq);
//删除
viewHolder.iv_eq_delete.setVisibility(View.GONE);
}
}
最后上完整代码:gitee传送门