最近在做一个公司的项目—平板广告机,相当于一个超大手机里面打开一个App。需求中有一个功能是从服务器获取广告机可能出现的问题数据,Android开发人员用列表显示,这些数据是给公司的检修人员看的。
需求:点击页面上的一个按钮,在页面上弹出一个包含列表的PopuWindow,列表的每一项中只含有一个CheckBox控件,如果选中相应的CheckBox控件,那么当检修人员点击提交按钮时,会把每个选中的CheckBox值传给服务器。
需求已经很清楚了,那我就写一个简单易懂的demo重现我们刚才的需求:
上项目列表
上布局文件
1.activity_main.xml
2.popuwindow_repair.xml
3.item_repair.xml
1.MainActivity
package com.xgr.checkbox;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
public class MainActivity extends Activity implements View.OnClickListener {
private ImageView ivShow;
private ImageView ivDismiss;
private RelativeLayout rlBottom;
private Button btnSkip;
private PopupWindow mPopupWindow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViews();
setListeners();
}
private void setViews() {
ivShow = (ImageView) findViewById(R.id.iv_show);
ivDismiss = (ImageView) findViewById(R.id.iv_dismiss);
rlBottom= (RelativeLayout) findViewById(R.id.rl_bottom);
btnSkip= (Button) findViewById(R.id.btn_skip_this);
}
private void setListeners() {
ivShow.setOnClickListener(this);
ivDismiss.setOnClickListener(this);
btnSkip.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_show:
if(mPopupWindow!=null){
return;
}
mPopupWindow=new CustomPopuWindow(this,R.layout.popuwindow_repair,0);
mPopupWindow.showAtLocation(rlBottom,0,0, Gravity.NO_GRAVITY);
break;
case R.id.iv_dismiss:
if(mPopupWindow!=null){
mPopupWindow.dismiss();
mPopupWindow=null;
return;
}
break;
case R.id.btn_skip_this:
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
finish();
break;
}
}
}
package com.xgr.checkbox;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xgr on 2017/11/25.
*/
public class BeanAdapter extends RecyclerView.Adapter {
private Context context;
private List list;
private List checklist;
public List getChecklist() {
return checklist;
}
public void setChecklist(List checklist) {
this.checklist = checklist;
}
public BeanAdapter(Context context, List list) {
this.context = context;
this.list = list;
checklist=new ArrayList<>();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_repair, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
JavaBean bean = list.get(position);
holder.checkBox.setText(bean.getName());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
checklist.add(holder.checkBox.getText().toString());
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBox;
public ViewHolder(View view) {
super(view);
checkBox = (CheckBox) view.findViewById(R.id.checkbox_problem);
}
}
}
3.JavaBean.class
package com.xgr.checkbox;
import java.io.Serializable;
/**
* Created by xgr on 2017/11/24.
*/
public class JavaBean implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4.CustomPopuWindow.class
package com.xgr.checkbox;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xgr on 2017/11/25.
*/
public class CustomPopuWindow extends PopupWindow {
private Context context;
private View mPopuWindow;
private RecyclerView mRecyclerView;
private List list = new ArrayList<>();
private BeanAdapter adapter;
private Button btnSubmit;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
break;
}
}
};
public CustomPopuWindow(Context context, int resLayout, int anchorHeight) {
super(context);
this.context = context;
initResLayout(resLayout);
setPopuWindow(anchorHeight);
initData(resLayout);
}
private void initResLayout(int resLayout) {
mPopuWindow = LayoutInflater.from(context).inflate(resLayout, null);
}
private void setPopuWindow(int anchorHeight) {
this.setContentView(mPopuWindow);
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
this.setHeight(800);
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0000000000);
// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
this.setBackgroundDrawable(dw);
}
private void initData(int resLayout) {
//报修弹窗布局
if (resLayout == R.layout.popuwindow_repair) {
initData();
setViews();
setAdapter();
setListeners();
}
}
private void initData() {
for (int i = 0; i < 20; i++) {
JavaBean bean = new JavaBean();
bean.setName("视频卡顿");
list.add(bean);
}
}
private void setViews() {
mRecyclerView = (RecyclerView) mPopuWindow.findViewById(R.id.recycler_view);
btnSubmit = (Button) mPopuWindow.findViewById(R.id.btn_submit);
}
private void setListeners() {
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
submitData();
}
});
}
private void submitData() {
if(adapter.getChecklist().size()<=0){
Toast.makeText(context,"您还未选择报修原因",Toast.LENGTH_LONG).show();
return;
}
StringBuilder sb=new StringBuilder();
for(int i=0;i 1) {
number = 2;//当数据大于1条时,列表分两列显示
} else {
number = 1;//当数据小于2条时,列表为一列显示,且数据居中
}
GridLayoutManager manager = new GridLayoutManager(context, number);
mRecyclerView.setLayoutManager(manager);
adapter = new BeanAdapter(context, list);
mRecyclerView.setAdapter(adapter);
}
}
ok,代码一股脑上完了,就是一个简单的demo,不是很难,但是很精髓。我也不过多的讲解了,大家试一试吧