Android Dialog实现全选反选
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组装电脑配置单推荐报价格
上传时间: 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 |