android中有時候遇到dialog+多個listview+checkbox的選擇問題如圖所示:
在dialog中左邊爲4個TextView,右邊爲四個listview(感覺不太合適,但沒找到比較好的解決辦法)。左邊選中時動態的隱藏與顯示listview,最後取出四個listview中checkbox的值。
代碼如下:
在主界面中
package com.example.mydialog;
import android.app.Dialog;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button;
private View inflate;
private Dialog dialog;
private TextView profession;
private TextView category;
private TextView project;
private TextView frequency;
private ListView listview;
private ListView listview2;
private ArrayList list;
private ArrayList list2;
private MyAdapter adapter;
private MyAdapter2 adapter2;
private TextView text;
private TextView cancel;
private TextView sure;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
text = (TextView) findViewById(R.id.text);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showMyDialog();
}
});
}
private void initDate() {
for (int i = 0; i < 20; i++) {
list.add("this is " + i);
}
}
private void showMyDialog() {
dialog = new Dialog(this, R.style.ActionSheetDialogStyle);
//填充對話框的佈局
inflate = LayoutInflater.from(this).inflate(R.layout.dialog_layout, null);
profession = (TextView) inflate.findViewById(R.id.profession);
category = (TextView) inflate.findViewById(R.id.category);
project = (TextView) inflate.findViewById(R.id.project);
frequency = (TextView) inflate.findViewById(R.id.frequency);
sure = (TextView) inflate.findViewById(R.id.sure);
listview = (ListView) inflate.findViewById(R.id.listview);
listview2 = (ListView) inflate.findViewById(R.id.listview2);
cancel = (TextView) inflate.findViewById(R.id.cancel);
list = new ArrayList();
list2 = new ArrayList();
profession.setOnClickListener(this);
category.setOnClickListener(this);
project.setOnClickListener(this);
frequency.setOnClickListener(this);
cancel.setOnClickListener(this);
sure.setOnClickListener(this);
//初始化控件
//將佈局設置給Dialog
dialog.setContentView(inflate);
//獲取當前Activity所在的窗體
Window dialogWindow = dialog.getWindow();
//設置Dialog從窗體底部彈出
dialogWindow.setGravity(Gravity.BOTTOM);
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 獲取屏幕寬、高用
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 獲取對話框當前的參數值
p.height = (int) (d.getHeight() * 0.6); // 高度設置爲屏幕的0.6
p.width = (int) (d.getWidth() * 1); // 寬度設置爲屏幕的0.65
dialogWindow.setAttributes(p);
dialog.show();//顯示對話框
initDate();
initDate2();
adapter = new MyAdapter(this, list);
listview.setAdapter(adapter);
adapter2 = new MyAdapter2(this, list2);
listview2.setAdapter(adapter2);
profession.setBackgroundColor(Color.parseColor("#3F51B5"));
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.profession:
profession.setBackgroundColor(Color.parseColor("#3F51B5"));
category.setBackgroundColor(Color.parseColor("#ffffff"));
listview.setVisibility(View.VISIBLE);
listview2.setVisibility(View.GONE);
break;
case R.id.category:
category.setBackgroundColor(Color.parseColor("#3F51B5"));
profession.setBackgroundColor(Color.parseColor("#ffffff"));
listview2.setVisibility(View.VISIBLE);
listview.setVisibility(View.GONE);
break;
case R.id.cancel:
dialog.dismiss();
break;
case R.id.sure:
//第一個listview中數據
HashMap<Integer, String> stateProfession = adapter.stateProfession;
for (Map.Entry<Integer, String> entry : stateProfession.entrySet()) {
Log.i("cb+++", entry.getValue() + "");
}
//第二個listview中數據
HashMap<Integer, String> stateCategory = adapter2.stateCategory;
for (Map.Entry<Integer, String> entry : stateCategory.entrySet()) {
Log.i("cb+++", entry.getValue() + "");
}
Toast.makeText(MainActivity.this,stateProfession.toString()+stateCategory.toString(),Toast.LENGTH_LONG).show();
text.setText(stateProfession.toString()+stateCategory.toString());
dialog.dismiss();
break;
}
}
private void initDate2() {
list2.add("aaa");
list2.add("bbb");
list2.add("ccc");
list2.add("ddd");
}
}
在adapter中代碼
package com.example.mydialog;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by Administrator on 2017/1/23.
*/
public class MyAdapter extends BaseAdapter {
private Context context;
private ArrayList list;
HashMap<Integer, String> stateProfession = new HashMap<Integer, String>();
public MyAdapter(Context context, ArrayList list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
ViewHolder vh;
if (convertView == null) {
vh = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
vh.textview = (TextView) convertView.findViewById(R.id.textview);
vh.cb = (CheckBox) convertView.findViewById(R.id.cb);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
vh.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
stateProfession.put(position, list.get(position) + "");
Log.i("cb---",list.get(position)+"");
} else {
stateProfession.remove(position);
}
}
});
vh.cb.setChecked((stateProfession.get(position) == null ? false : true));
vh.textview.setText(list.get(position) + "");
return convertView;
}
static class ViewHolder {
TextView textview;
CheckBox cb;
}
}
demo下載地址
http://download.csdn.net/detail/androidxiaogang/9746619