android一步步实现dialog选择框,支持单选和多选

前提:需要先导入baseReclyAdapterlibrary的model点击打开链接

1、创建dialog

package com.yann.yanndemo.dialog;

import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;

import com.chad.library.adapter.base.helper.RecyclerViewHelper;
import com.yann.yanndemo.R;
import com.yann.yanndemo.adapter.DialogSelectorAdapter;
import com.yann.yanndemo.entity.SimpleListItemEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wyy on 2018/1/20.
 */

public class DialogSelector extends AlertDialog implements DialogSelectorAdapter.OnItemClickListener {
    private RecyclerView rv_selector_branch;
    private OnSelectorListener cdListener;
    private List<SimpleListItemEntity> mSimpleListItemEntity = new ArrayList<>();
    private List<SimpleListItemEntity> selectorSimpleListItemEntity = new ArrayList<>();
    private DialogSelectorAdapter mSelectorBranchAdapter;
    private Context context;
    private Button btn_cancel;
    private Button btn_ok;
    private String isProcessVariable;

    public DialogSelector(Context context, List<SimpleListItemEntity> mSimpleListItemEntity, String isProcessVariable, OnSelectorListener cdListener) {
        super(context);
        this.context = context;
        this.cdListener = cdListener;
        this.mSimpleListItemEntity = mSimpleListItemEntity;
        this.isProcessVariable = isProcessVariable;    //1为单选,否则为多选
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.dialog_selector);
        this.setCanceledOnTouchOutside(true); // 点击外部会消失
        InitViews();
    }

    private void InitViews() {
        rv_selector_branch = (RecyclerView) findViewById(R.id.rv_selector);
        mSelectorBranchAdapter = new DialogSelectorAdapter(R.layout.selector_branch_item, isProcessVariable.equals("1") ? 1 : 0);
        mSelectorBranchAdapter.setOnBranchItemClickListener(this);
        RecyclerViewHelper.initRecyclerViewV(context, rv_selector_branch, true, mSelectorBranchAdapter);
        mSelectorBranchAdapter.setNewData(mSimpleListItemEntity);
        btn_cancel = (Button) findViewById(R.id.btn_cancel);
        btn_ok = (Button) findViewById(R.id.btn_ok);
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cdListener.cancel();
            }
        });
        btn_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < mSimpleListItemEntity.size(); i++) {
                    if (mSimpleListItemEntity.get(i).isSelector()) {
                        selectorSimpleListItemEntity.add(mSimpleListItemEntity.get(i));
                    }
                }
                cdListener.getSelectorData(selectorSimpleListItemEntity);

            }
        });
    }

    @Override
    public void onItemClick(int position) {
        if (isProcessVariable.equals("1")) {
            for (int i = 0; i < mSimpleListItemEntity.size(); i++) {
                if (i == position) {
                    if (!mSimpleListItemEntity.get(i).isSelector()) {
                        mSimpleListItemEntity.get(i).setSelector(true);
                    }
                } else {
                    mSimpleListItemEntity.get(i).setSelector(false);
                }
            }
        } else {
            boolean temp = !mSimpleListItemEntity.get(position).isSelector();
            mSimpleListItemEntity.get(position).setSelector(temp);
        }
        mSelectorBranchAdapter.setNewData(mSimpleListItemEntity);
    }

    public interface OnSelectorListener {
        void getSelectorData(List<SimpleListItemEntity> trees);

        void cancel();
    }
}
添加dialog布局文件dialog_selector

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_selector"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/tv_bottom_line"
            android:layout_width="match_parent"
            android:layout_height="@dimen/leave_line_height"
            android:layout_above="@+id/ll_bottom_btn"
            android:background="@color/leave_add_line"/>

        <LinearLayout
            android:id="@+id/ll_bottom_btn"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn_cancel"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@drawable/refer_tree_cancel_btn"
                android:text="@string/cancel"
                android:textColor="@color/color_232323"/>

            <Button
                android:id="@+id/btn_ok"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@drawable/refer_tree_ok_btn"
                android:text="@string/ok"
                android:textColor="@color/white"/>


        </LinearLayout>


    </RelativeLayout>
</RelativeLayout>
二、新建弹出框列表适配器

package com.yann.yanndemo.adapter;

import android.support.annotation.LayoutRes;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.yann.yanndemo.R;
import com.yann.yanndemo.entity.SimpleListItemEntity;

/**
 * Created by wyy on 2018/1/20.
 */

public class DialogSelectorAdapter extends BaseQuickAdapter<SimpleListItemEntity, BaseViewHolder> {

    private static final String TAG = DialogSelectorAdapter.class.getSimpleName();
    private OnItemClickListener mOnItemClickListener;
    private int isSingle = 1;    //为1的话为单选,默认为单选,否则的话为多选
    public DialogSelectorAdapter(@LayoutRes int layoutResId, int type) {
        super(layoutResId);
        this.isSingle = type;
    }

    public void setOnBranchItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    @Override
    protected void convert(BaseViewHolder helper, SimpleListItemEntity item, final int position) {
        RelativeLayout rootView = helper.getView(R.id.rl_branch_item_root);
        TextView name = helper.getView(R.id.txt_tree_name);
        CheckBox cb_contact = helper.getView(R.id.cb_contact);
        RadioButton rb_contact = helper.getView(R.id.rb_contact);
        rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnItemClickListener.onItemClick(position);
            }
        });
        name.setText(item.getName());
        if (isSingle == 1) {
            rb_contact.setChecked(item.isSelector());
        } else {
            cb_contact.setVisibility(View.VISIBLE);
            rb_contact.setVisibility(View.GONE);
            cb_contact.setChecked(item.isSelector());
        }
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }
}
添加适配器布局文件selector_branch_item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/rl_branch_item_root"
                android:layout_width="match_parent"
                android:layout_height="50dp">

    <TextView
        android:id="@+id/txt_tree_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="@dimen/margins"
        android:textColor="@color/common_personInfo_text_bg"
        android:textSize="16sp"
        tools:text="阿里巴巴与四十大盗"/>

    <CheckBox
        android:id="@+id/cb_contact"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_marginRight="@dimen/margins"
        android:button="@drawable/check_remember"
        android:focusable="false"
        android:clickable="false"
        android:textColor="#b2b2b2"
        android:textSize="16sp"
        android:visibility="gone"/>

    <RadioButton
        android:id="@+id/rb_contact"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_marginRight="@dimen/margins"
        android:button="@drawable/radio_selector"
        android:focusable="false"
        android:clickable="false"
        android:textColor="#b2b2b2"
        android:textSize="16sp"/>
</RelativeLayout>


创建实体类

package com.yann.yanndemo.entity;

/**
 * Created by wyy on 2018/1/20.
 */

public class SimpleListItemEntity {
    private String id;
    private String name;
    private boolean isSelector = false;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSelector() {
        return isSelector;
    }

    public void setSelector(boolean selector) {
        isSelector = selector;
    }
}
三、创建一个DialogHelper管理dialog

package com.yann.yanndemo.dialog;

import android.content.Context;

import com.yann.yanndemo.R;
import com.yann.yanndemo.entity.SimpleListItemEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wyy on 2018/1/21.
 */

public class DialogHelper {
    private static final String TAG = DialogHelper.class.getSimpleName();
    private Context context;
    private int style = R.style.CustomDialog;//默认style
    private String title = "";//标题
    private List<SimpleListItemEntity> mSimpleListItemEntity = new ArrayList<>();    //选择列表的数据
    private OnHelperSelectorListener onSelectorListener;
    private DialogSelector mDialogSelector;
    private String isProcessVariable;    //判断单选还是多选

    private DialogHelper(Context context) {
        this.context = context;
    }

    /**
     * 初始化
     *
     * @param context
     * @return
     */
    public static DialogHelper create(Context context) {
        return new DialogHelper(context);
    }

    /**
     * 可选,设置dialog的style,一般情况下用默认的
     *
     * @param style
     * @return
     */
    public DialogHelper style(int style) {
        this.style = style;
        return this;
    }

    /**
     * 设置标题,建议使用的时候都配置
     *
     * @param title
     * @return
     */
    public DialogHelper title(String title) {
        this.title = title;
        return this;
    }

    /**
     * 设置部门列表的数据
     *
     * @param contactTreeList
     * @return
     */
    public DialogHelper setSelectorData(List<SimpleListItemEntity> contactTreeList) {
        this.mSimpleListItemEntity = contactTreeList;
        return this;
    }

    /**
     * 设置选择部门监听
     *
     * @param onSelectorListener
     * @return
     */
    public DialogHelper setSelectorListener(OnHelperSelectorListener onSelectorListener) {
        this.onSelectorListener = onSelectorListener;
        return this;
    }

    public DialogHelper setIsProcessVariable(String isProcessVariable) {
        this.isProcessVariable = isProcessVariable;
        return this;
    }

    public void showSelectorDialog() {
        mDialogSelector = new DialogSelector(context, mSimpleListItemEntity, isProcessVariable, new DialogSelector.OnSelectorListener() {
            @Override
            public void getSelectorData(List<SimpleListItemEntity> trees) {
                mDialogSelector.dismiss();
                onSelectorListener.getSelectorPosition(trees);
            }

            @Override
            public void cancel() {
                mDialogSelector.dismiss();
            }
        });
        mDialogSelector.setCancelable(false);
        mDialogSelector.show();
    }

    public interface OnHelperSelectorListener {
        void getSelectorPosition(List<SimpleListItemEntity> trees);
    }

}
最后在activity中调用dialog,实现相关的点击事件

package com.yann.yanndemo.ui.dialog;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.yann.yanndemo.R;
import com.yann.yanndemo.dialog.DialogHelper;
import com.yann.yanndemo.entity.SimpleListItemEntity;

import java.util.ArrayList;
import java.util.List;

public class DialogActivity extends Activity implements View.OnClickListener, DialogHelper.OnHelperSelectorListener {
    private static final String TAG = DialogActivity.class.getSimpleName();
    private Button btn_dialog_selector;

    //选择弹出框
    private List<SimpleListItemEntity> mSimpleListItemEntity = new ArrayList<>();
    private String selectorBranchName = "";
    private String branchNames = "";
    private static final String isProcessVariable = "1";    //这里1为单选,否则为多选

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        initView();
        initData();
    }

    private void initData() {
        for (int i = 0; i < 6; i++) {
            SimpleListItemEntity simpleListItemEntity = new SimpleListItemEntity();
            simpleListItemEntity.setId(i + "");
            simpleListItemEntity.setName("星期" + i);
            mSimpleListItemEntity.add(simpleListItemEntity);
        }

    }

    private void initView() {
        btn_dialog_selector = (Button) findViewById(R.id.btn_dialog_selector);
        btn_dialog_selector.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_dialog_selector:
                DialogHelper.create(this).setIsProcessVariable(isProcessVariable).setSelectorData(mSimpleListItemEntity).setSelectorListener(this)
                        .showSelectorDialog();
                break;
            default:
                break;
        }
    }

    /**
     * 获取选择弹出框返回的数据
     *
     * @param trees
     */
    @Override
    public void getSelectorPosition(List<SimpleListItemEntity> trees) {
        StringBuilder branchIdBuilder = new StringBuilder();
        StringBuilder branchNameBuilder = new StringBuilder();
        if (!selectorBranchName.equals(" ")) {
            selectorBranchName = " ";
        }
        branchNames = "";
        if (trees != null && !trees.isEmpty()) {
            for (int i = 0; i < trees.size(); i++) {
                String branchId = trees.get(i).getId();
                if (i == 0) {
                    branchIdBuilder.append(branchId);
                    branchNameBuilder.append(trees.get(i).getName());
                } else {
                    branchIdBuilder.append("," + branchId);
                    branchNameBuilder.append("," + trees.get(i).getName());
                }
                for (int j = 0; j < mSimpleListItemEntity.size(); j++) {
                    if (branchId.equals(mSimpleListItemEntity.get(j).getId())) {
                        mSimpleListItemEntity.get(j).setSelector(true);
                    }
                }
            }
            branchNames = branchNameBuilder.toString();
            selectorBranchName = " " + branchNames;
        }
        Toast.makeText(this, selectorBranchName, Toast.LENGTH_LONG).show();
        Log.d(TAG, "selectorBranchName===" + selectorBranchName);
    }
}

以上可以实现弹出框的默认选择值,保存选中状态,实体类和适配器的布局都可以根据项目的实际情况自定义,效果图如下:


demo地址



猜你喜欢

转载自blog.csdn.net/yann02/article/details/79123138