利用ListView来做弹出对话框的多选列表

    转载请注明地址
    android中的ListView支持多选的模式,使用ListView来操作多选菜单非常方便,因此做了一个弹出多选列表的对话框,该对话框并没有使用Dialog自带的setMultiChoiceItems,而是通过setView来加载一个多选模式的ListView列表实现多选的功能。
    先来看效果图


    下面是实现代码MainActivity.java
package kgh.com.listviewdemo;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView listView;
    private ListView itemList;
    private List list=new ArrayList();
    private Button clickBtn;
    private Button clickBtn2;
    private SparseBooleanArray lastCheckedId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView= (ListView) findViewById(R.id.listview);
        clickBtn= (Button) findViewById(R.id.clickBtn);
        clickBtn2= (Button) findViewById(R.id.clickBtn2);
        for(int i=1;i<=20;i++) {
            list.add("选项"+i);
        }
        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, list));
        clickBtn.setOnClickListener(this);
        clickBtn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.clickBtn:
                String selectItem="";
                SparseBooleanArray checkedId = listView.getCheckedItemPositions();
                for (int i = 0; i < checkedId.size(); i++) {
                    if(checkedId.valueAt(i)) {
                        selectItem += list.get(checkedId.keyAt(i))+",";
                    }
                }
                if("".equals(selectItem)){
                    Toast.makeText(MainActivity.this,"当前列表没有选中项", Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(MainActivity.this,"当前列表的选中项为:"+selectItem, Toast.LENGTH_SHORT).show();
                }
                break;

            case R.id.clickBtn2:
                itemList=new ListView(MainActivity.this);
                itemList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                itemList.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, list));
                //恢复上次选中的记录
                if(null!=lastCheckedId) {
                    for (int i = 0; i < lastCheckedId.size(); i++) {
                        //先判断是否有这一选项
                        if (null != itemList.getItemAtPosition(lastCheckedId.keyAt(i))) {
                            //如果还有这一选项则恢复它选中的状态
                            itemList.setItemChecked(lastCheckedId.keyAt(i), lastCheckedId.valueAt(i));
                        }
                    }
                }

                new AlertDialog.Builder(MainActivity.this)
                        .setTitle("多选框 ")
//加载我们的ListView
                        .setView(itemList)
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String selectItem="";
                                lastCheckedId = itemList.getCheckedItemPositions();
                                SparseBooleanArray checkedId = itemList.getCheckedItemPositions();
                                for (int i = 0; i < checkedId.size(); i++) {
                                    if(checkedId.valueAt(i)) {
                                        selectItem += list.get(checkedId.keyAt(i))+",";
                                    }
                                }
                                if("".equals(selectItem)){
                                    Toast.makeText(MainActivity.this,"弹出列表没有选中项", Toast.LENGTH_SHORT).show();
                                }
                                else {
                                    Toast.makeText(MainActivity.this,"弹出列表的选中项为:"+selectItem, Toast.LENGTH_SHORT).show();
                                }
                            }
                        })
                        .setNegativeButton("取消", null)
                        .show();
                break;
        }
    }
}


    布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击显示当前列表选中项"
            android:id="@+id/clickBtn"
            android:layout_gravity="center_horizontal" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击弹出一个选项列表"
            android:id="@+id/clickBtn2" />
    </LinearLayout>

    <ListView
        android:id="@+id/listview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:choiceMode="multipleChoice">
    </ListView>

</LinearLayout>

猜你喜欢

转载自xlkgh.iteye.com/blog/2250308