经验总结-RecyclerView列表中获取每个item中已经选择的CheckBox值

最近在做一个公司的项目—平板广告机,相当于一个超大手机里面打开一个App。需求中有一个功能是从服务器获取广告机可能出现的问题数据,Android开发人员用列表显示,这些数据是给公司的检修人员看的。


需求:点击页面上的一个按钮,在页面上弹出一个包含列表的PopuWindow,列表的每一项中只含有一个CheckBox控件,如果选中相应的CheckBox控件,那么当检修人员点击提交按钮时,会把每个选中的CheckBox值传给服务器。


需求已经很清楚了,那我就写一个简单易懂的demo重现我们刚才的需求:


上项目列表


上布局文件

1.activity_main.xml





    



2.popuwindow_repair.xml






    

        
    

    


3.item_repair.xml




    


上java代码


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;
        }
    }

}



2.BeanAdapter.class




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,不是很难,但是很精髓。我也不过多的讲解了,大家试一试吧




你可能感兴趣的:(经验总结-RecyclerView列表中获取每个item中已经选择的CheckBox值)