智者不为愚者谋,勇者不为怯者死。这篇文章主要讲述Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)相关的知识,希望能为你提供帮助。
先放效果截图
项目中需要有个Dialog全选对话框,点击全选全部选中,取消全选全部取消。下午查了些资料,重写了一下Dialog对话框。把代码放出来。
文章图片
public class MainActivity extends Activity {
View getlistview;
String[] mlistText = { "全选", "选择1", "选择2", "选择3", "选择4", "选择5", "选择6", "选择7" };
ArrayList<
Map<
String, Object>
>
mData = https://www.songbingjia.com/android/new ArrayList<
Map<
String, Object>
>
();
AlertDialog.Builder builder;
AlertDialog builder2;
SimpleAdapter adapter;
Boolean[] bl = { false, false, false, false, false, false, false, false };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.btn);
int lengh = mlistText.length;
for (int i = 0;
i <
lengh;
i++) {
Map<
String, Object>
item = new HashMap<
String, Object>
();
item.put("text", mlistText[i]);
mData.add(item);
}
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CreateDialog();
// 点击创建Dialog
}
});
}class ItemOnClick implements OnItemClickListener {@Override
public void onItemClick(AdapterView<
?>
arg0, View view, int position, long id) {
CheckBox cBox = (CheckBox) view.findViewById(R.id.X_checkbox);
if (cBox.isChecked()) {
cBox.setChecked(false);
} else {
Log.i("TAG", "取消该选项");
cBox.setChecked(true);
}if (position == 0 &
&
(cBox.isChecked())) {
//如果是选中 全选就把所有的都选上 然后更新
for (int i = 0;
i <
bl.length;
i++) {
bl[i] = true;
}
adapter.notifyDataSetChanged();
} else if (position == 0 &
&
(!cBox.isChecked())) {
//如果是取消全选 就把所有的都取消 然后更新
for (int i = 0;
i <
bl.length;
i++) {
bl[i] = false;
}
adapter.notifyDataSetChanged();
}
if (position != 0 &
&
(!cBox.isChecked())) {
// 如果把其它的选项取消把全选取消
bl[0] = false;
bl[position]=false;
adapter.notifyDataSetChanged();
} else if (position != 0 &
&
(cBox.isChecked())) {
//如果选择其它的选项,看是否全部选择
//先把该选项选中 设置为true
bl[position]=true;
int a = 0;
for (int i = 1;
i <
bl.length;
i++) {
if (bl[i] == false) {
//如果有一个没选中就不是全选 直接跳出循环
break;
} else {
//计算有多少个选中的
a++;
if (a == bl.length - 1) {
//如果选项都选中,就把全选 选中,然后更新
bl[0] = true;
adapter.notifyDataSetChanged();
}
}
}
}
}}public void CreateDialog() {// 动态加载一个listview的布局文件进来
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
getlistview = inflater.inflate(R.layout.listview, null);
// 给ListView绑定内容
ListView listview = (ListView) getlistview.findViewById(R.id.X_listview);
adapter = new SetSimpleAdapter(MainActivity.this, mData, R.layout.listitem, new String[] { "text" },
new int[] { R.id.X_item_text });
// 给listview加入适配器
listview.setAdapter(adapter);
listview.setItemsCanFocus(false);
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listview.setOnItemClickListener(new ItemOnClick());
builder = new AlertDialog.Builder(this);
builder.setTitle("请选择查询类型");
builder.setIcon(R.drawable.ic_launcher);
//设置加载的listview
builder.setView(getlistview);
builder.setPositiveButton("确定", new DialogOnClick());
builder.setNegativeButton("取消", new DialogOnClick());
builder.create().show();
}class DialogOnClick implements DialogInterface.OnClickListener {@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case Dialog.BUTTON_POSITIVE:
//确定按钮的事件
break;
case Dialog.BUTTON_NEGATIVE:
//取消按钮的事件
break;
default:
break;
}
}
}//重写simpleadapterd的getview方法
class SetSimpleAdapter extends SimpleAdapter {public SetSimpleAdapter(Context context, List<
? extends Map<
String, ?>
>
data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
}@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LinearLayout.inflate(getBaseContext(), R.layout.listitem, null);
}
CheckBox ckBox = (CheckBox) convertView.findViewById(R.id.X_checkbox);
//每次都根据 bl[]来更新checkbox
if (bl[position] == true) {
ckBox.setChecked(true);
} else if (bl[position] == false) {
ckBox.setChecked(false);
}
return super.getView(position, convertView, parent);
}
}
}
【Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)】布局文件
<
RelativeLayout 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="${relativePackage}.${activityClass}" >
<
Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击弹出Dialog" />
<
/RelativeLayout>
<
RelativeLayout 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="${relativePackage}.${activityClass}" >
<
ListView
android:id="@+id/X_listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<
/ListView>
<
/RelativeLayout>
<
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="${relativePackage}.${activityClass}" >
<
RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants" >
<
TextView
android:id="@+id/X_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选项" />
<
CheckBox
android:id="@+id/X_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:clickable="false"
android:focusable="false" />
<
/RelativeLayout>
<
/LinearLayout>
推荐阅读
- 配置文件——App.config文件读取和修改
- 不安分的android开发者(小程序初尝试,前后台都自己做)
- Android进程机制
- App inventor的初级教程粗略地介绍
- Android进阶之绘制-自定义View完全掌握
- Django命名空间app_name和namespace
- dubbo Wrapper
- android AlertDialog控件使用
- Linux下设置swappiness参数来配置内存使用到多少才开始使用swap分区(转)