您现在的位置是:首页 > 数码 > 

Android Dialog实现全选反选

2025-07-27 14:10:49
Android Dialog实现全选反选         Android的AlertDialog中可以通过builder.setMultiChoiceItems(....)来添加一个多选项,但是并不能实现对选项的全选/反选功能,所以需要自定义一个控件。原理是通过ListView  CheckBox来实现,实现效果如下。 一、定义布局样式&

Android Dialog实现全选反选

        Android的AlertDialog中可以通过builder.setMultiChoiceItems(....)来添加一个多选项,但是并不能实现对选项的全选/反选功能,所以需要自定义一个控件。原理是通过ListView  CheckBox来实现,实现效果如下。

一、定义布局样式:

     首先需要定义多选弹出框的样式,custom_mutiplechoice_view.xml:

<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=  android:layout_width=match_parent  android:layout_height=match_parent android:orientation=verticalandroid:background=@android:color/background_dark><TextView android:id=@id/mutiplechoice_titleandroid:layout_width=match_parentandroid:layout_height=40dpandroid:gravity=center_verticalandroid:padding=5dpandroid:background=@android:color/darker_grayandroid:textSize=18spandroid:textColor=@android:color/blackandroid:text=标题/><LinearLayout android:layout_width=match_parent  android:layout_height=match_parent  android:orientation=vertical android:layout_margin=1dpandroid:background=@android:color/background_light>  <ListView  android:id=@id/mutiplechoice_listview  android:layout_width=match_parent  android:layout_height=00dp  android:layout_weight=4/>  <LinearLayout  android:layout_width=match_parent  android:layout_height=wrap_content  android:layout_weight=1android:gravity=centerandroid:orientation=horizontal android:background=@android:color/darker_gray>  <Button  android:id=@id/mutiplechoice_selectall_btn  android:layout_width=0dp  android:layout_height=wrap_content  android:layout_weight=1android:text=全选 />  <Button  android:id=@id/mutiplechoice_ok_btn  android:layout_width=0dp  android:layout_height=wrap_content  android:layout_weight=1android:text=确定 />  </LinearLayout>  </LinearLayout>
</LinearLayout>

ListView条目的样式, custom_mutiplechoice_view_list_item.xml:

<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=  android:layout_width=fill_parent  android:layout_height=fill_parent  android:orientation=horizontal >  <TextView  android:id=@id/item_tv  android:layout_width=0dp  android:layout_height=wrap_content  android:layout_gravity=center_vertical  android:layout_weight=1 android:paddingLeft=10dpandroid:textColor=@android:color/black/>  <CheckBox  android:id=@id/item_cb  android:layout_width=wrap_content  android:layout_height=wrap_content  android:clickable=false  android:focusable=false  android:focusableInTouchMode=false  android:gravity=center_vertical />  </LinearLayout> 

然后是定义弹出框的布局,dialog_multiplechoice.xml:

<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=android:layout_width=match_parentandroid:layout_height=match_parentandroid:layout_margin=0dpandroid:orientation=vertical android:background=@android:color/background_light><CustomMultipleChoiceViewandroid:id=@id/CustomMultipleChoiceViewandroid:layout_width=match_parentandroid:layout_height=match_parent></CustomMultipleChoiceView>
</LinearLayout>

Activity主界面的布局,activity_main.xml:

<RelativeLayout xmlns:android=xmlns:tools=android:layout_width=match_parentandroid:layout_height=match_parenttools:context=.MainActivity ><EditText android:id=@id/textandroid:layout_width=match_parentandroid:layout_height=wrap_content/><Buttonandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:layout_centerHorizontal=trueandroid:layout_centerVertical=trueandroid:onClick=OnViewClickandroid:text=显示多选对话框 /></RelativeLayout>

二、弹出框ListView是适配器,MutipleChoiceAdapter.java:

package ;import Context;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;public class MutipleChoiceAdapter extends BaseAdapter {// 填充数据的list  private String[] list;  // 用来控制CheckBox的选中状况  private SparseBooleanArray isSelected;  // 用来导入布局  private LayoutInflater inflater;  public MutipleChoiceAdapter(String[] list, Context context) {this.list = list;  inflater = LayoutInflater.from(context);  isSelected = new SparseBooleanArray();  // 初始化数据  initData();  }// 初始化isSelected的数据  private void initData() {  for (int i = 0; i < list.length; i) {  getIsSelected().put(i, false);  }  }  @Override  public int getCount() {  return list.length;  }  @Override  public Object getItem(int position) {  return list[position];  }  @Override  public long getItemId(int position) {  return position;  }  @Override  public View getView(int position, View convertView, ViewGroup parent) {  ViewHolder holder = null;  if (convertView == null) {  // 获得ViewHolder对象  holder = new ViewHolder();  // 导入布局并赋值给convertview  convertView = inflater.inflate(R._mutiplechoice_view_list_item, null);   = (TextView) convertView.findViewById(R.id.item_tv);   = (CheckBox) convertView.findViewById(R.id.item_cb);  // 为view设置标签  convertView.setTag(holder);  } else {  // 取出holder  holder = (ViewHolder) convertView.getTag();  }  // 设置list中TextView的显示  .setText(list[position]);  // 根据isSelected来设置checkbox的选中状况  .setChecked(getIsSelected().get(position));  return convertView;  }  public SparseBooleanArray getIsSelected() {  return isSelected;  }  public void setIsSelected(SparseBooleanArray isSelected) {  this.isSelected = isSelected;  }  public static class ViewHolder {  TextView tv;  public CheckBox cb;  }  
}

多选对话框的自定义View,CustomMultipleChoiceView.java:

package ;import MutipleChoiceAdapter.ViewHolder;import Context;
import android.util.AttributeSet;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
/*** 自定义的带 全选/反选 功能的多选对话框* @author king* @creation 201-8-28*/
public class CustomMultipleChoiceView extends LinearLayout {private MutipleChoiceAdapter mAdapter;private String[] data;private TextView title;private ListView lv;private onSelectedListener onSelectedListener;//确定选择private boolean curWillCheckAll = false;//当前点击按钮时是否将全选public CustomMultipleChoiceView(Context context, AttributeSet attrs) {super(context, attrs);initView();}public CustomMultipleChoiceView(Context context) {super(context);initView();}private void initView(){/* 实例化各个控件 */  LayoutInflater inflater = LayoutInflater.from(getContext());View view = inflater.inflate(R._mutiplechoice_view, null);lv = (ListView) view.findViewById(R._listview);  Button bt_selectall = (Button) view.findViewById(R._selectall_btn);  Button bt_ok = (Button) view.findViewById(R._ok_btn);title = (TextView) view.findViewById(R._title);if(curWillCheckAll){bt_selectall.setText(全选);}else{bt_selectall.setText(反选);}MyClickListener l = new MyClickListener();// 全选按钮的回调接口  bt_selectall.setOnClickListener(l);  bt_ok.setOnClickListener(l);// 绑定listView的  lv.setOnItemClickListener(new OnItemClickListener() {  @Override  public void onItemClick(AdapterView<?> arg0, View arg1, int position,  long arg) {  // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤  ViewHolder holder = (ViewHolder) arg1.getTag();  // 改变CheckBox的状态  .toggle();  // 将CheckBox的选中状况记录下来  mAdapter.getIsSelected().put(position, .isChecked());}  }); 
//        positiveBtn.setOnClickListener(l);addView(view);}public void setData(String[] data, boolean[] isSelected){if(data == null){throw new IllegalArgumentException(data is null);}this.data = data;mAdapter = new MutipleChoiceAdapter(data, getContext()); if(isSelected != null){if(isSelected.length != data.length){throw new IllegalArgumentException(data	s length not equal the isSelected	s length);}else{for(int i=0; i<isSelected.length; i){mAdapter.getIsSelected().put(i, isSelected[i]);}}}// 绑定Adapter  lv.setAdapter(mAdapter);  }public void setTitle(String title){if( != null){.setText(title);}}public void setOnSelectedListener(onSelectedListener l){ = l;}public interface onSelectedListener{public void onSelected(SparseBooleanArray sparseBooleanArray);}/*** 全选*/public void selectAll(){if(data != null){for (int i = 0; i < data.length; i) {  mAdapter.getIsSelected().put(i, true);  } // 刷新listview和TextView的显示  ();}}/*** 全不选*/public void deselectAll(){if(data != null){for (int i = 0; i < data.length; i) {  mAdapter.getIsSelected().put(i, false);  } // 刷新listview和TextView的显示  ();}}/*** 反选*/public void reverseSelect(){if(data != null){for (int i = 0; i < data.length; i) {  mAdapter.getIsSelected().put(i, !mAdapter.getIsSelected().get(i));  }  // 刷新listview和TextView的显示  ();}}private class MyClickListener implements OnClickListener{@Overridepublic void onClick(View v) {switch (v.getId()) {case R._selectall_btn://全选/反选按钮if(data == null){return;}if(curWillCheckAll){selectAll();}else{deselectAll();}if(curWillCheckAll){((Button)v).setText(反选);}else{((Button)v).setText(全选);}curWillCheckAll = !curWillCheckAll;break;case R._ok_btn://确定选择的按钮if(onSelectedListener != null && mAdapter != null){(mAdapter.getIsSelected());}break;default:break;}}}
}

最后,是主界面Activity的代码,MainActivity.java:

package ;import android.app.Activity;
import Bundle;
import android.util.SparseBooleanArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TextView;import ;public class MainActivity extends Activity {private PopupWindow stationSelectDialog;private EditText edtView;@Overrideprotected void onCreate(Bundle savedInstanceState) {(savedInstanceState);setContentView(R.layout.activity_main);edtView = (EditText) findViewById(R.);}public void OnViewClick(View v){showMutiChoiceDialog(new String[]{选项一,选项二,选项三,选项四,选项五,选项六,选项七,选项八,选项九,选项十,}, edtView);}private void showMutiChoiceDialog(final String[] statiMean, final TextView textView){if(stationSelectDialog == null){LayoutInflater inflater = LayoutInflater.from(this);View view = inflater.inflate(R.layout.dialog_multiplechoice, null);CustomMultipleChoiceView mutipleChoiceView = (CustomMultipleChoiceView) view.findViewById(R.id.CustomMultipleChoiceView);mutipleChoiceView.setData(statiMean, null);mutipleChoiceView.selectAll();mutipleChoiceView.setTitle(多选);stationSelectDialog = new PopupWindow(view, LayoutParams.WRAP_COTET, LayoutParams.WRAP_COTET, true);mutipleChoiceView.setOnSelectedListener(new onSelectedListener() {@Overridepublic void onSelected(SparseBooleanArray sparseBooleanArray) {stationSelectDialog.dismiss();StringBuilder sb = new StringBuilder();for(int i=0; i<sparseBooleanArray.size(); i){if(sparseBooleanArray.get(i)){sb.append(statiMean[i]  ,);}}if(sb.length() > 0)sb.deleteCharAt(sb.length()-1);textView.setText(());}});}stationSelectDialog.showAtLocation(getCurrentFocus(), Gravity.CETER, 0, 0);}@Overridepublic boolean onCreateOptiMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(activity_main, menu);return true;}}

Ok,就是这么简单。

完整代码下载:例子

文章出自点击打开链接转载请注明出处。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/857321.html

相关标签:无
上传时间: 2024-02-10 12:02:46
留言与评论(共有 18 条评论)
本站网友 红糖的功效与作用
5分钟前 发表
选项三
本站网友 中国制造业
0秒前 发表
选项八
本站网友 李俊英
1分钟前 发表
ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { // 获得ViewHolder对象 holder = new ViewHolder(); // 导入布局并赋值给convertview convertView = inflater.inflate(R._mutiplechoice_view_list_item
本站网友 健客网上药店
8分钟前 发表
layout_width=0dp android
本站网友 合肥美术馆
6分钟前 发表
textColor=@android
本站网友 牛蒡子的功效与作用
14分钟前 发表
选项三
本站网友 google网站收录
15分钟前 发表
textColor=@android
本站网友 美甲培训中心
12分钟前 发表
context=.MainActivity ><EditText android
本站网友 邢丹
26分钟前 发表
gravity=centerandroid
本站网友 导赤散
26分钟前 发表
//全选/反选按钮if(data == null){return;}if(curWillCheckAll){selectAll();}else{deselectAll();}if(curWillCheckAll){((Button)v).setText(反选);}else{((Button)v).setText(全选);}curWillCheckAll = !curWillCheckAll;break;case R._ok_btn
本站网友 老富贵论坛
20分钟前 发表
layout_height=wrap_content android
本站网友 衣帽间效果图
10分钟前 发表
layout_height=wrap_content android
本站网友 不吃晚饭减肥法
11分钟前 发表
layout_height=match_parent></CustomMultipleChoiceView> </LinearLayout> Activity主界面的布局,activity_main.xml: <RelativeLayout xmlns
本站网友 王晓清
10分钟前 发表
layout_weight=1android
本站网友 美食优惠
1分钟前 发表
layout_height=00dp android
本站网友 鸡蛋煮几分钟
4分钟前 发表
View arg1
本站网友 肥城租房
29分钟前 发表
layout_height=match_parent android