文章目录
前言
因为最近开发的需要 做了一个自定义Android的dialog 这里做一下记录
一、Dialog是什么
Dialog翻译过来就是对话,dialog日常使用一般就是询问对话,是否下载,是否打开之类的一些对话,但在有些时候你需要打开一个新界面实现一些简单功能,新建activity又耗时耗内存,那就可以使用dialog,我一般叫做弹窗,实现对话的就是对话弹窗,实现功能的就是功能弹窗。
二、功能介绍
这边要实现的是一个列表弹窗,可以添加删除还有下载指定item的功能,效果图如下:
三、界面设计
1.List item设计
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="75dp"
android:paddingBottom="5pt">
//这里的图片可以替换成自己的,也可以不要
<ImageView
android:id="@+id/imageView_headpic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginTop="5pt"
android:layout_marginRight="10pt"
android:src="@drawable/cft1" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="70dp"
android:layout_marginTop="6pt"
android:orientation="vertical">
<TextView
android:id="@+id/tv_dialog_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#367EAA" />
<TextView
android:id="@+id/tv_dialog_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="#818095" />
</LinearLayout>
<LinearLayout
android:layout_width="150dp"
android:layout_height="80dp"
android:layout_alignParentRight="true"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_dialog_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:text="Textview"
android:textColor="#818095" />
<Button
android:text="加载"
android:id="@+id/btn_dialog_load"
android:layout_width="70dp"
android:layout_height="35dp"
android:layout_marginTop="20dp"
android:alpha="0.5"
android:background="@drawable/button_rounded_background" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
每一个item的样式
2.ListView布局设计
这里面有三个按钮 被我默认不加载了 可以在java里面设置显示,
或者可以在Button控件上把visibility设置为visible。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black">
<EditText
android:singleLine="true"
android:textColor="@color/white"
android:textColorHint="@color/white"
android:id="@+id/ed_dialog_search"
android:hint="搜索"
android:layout_marginLeft="20dp"
android:layout_marginRight="30dp"
android:textSize="15dp"
android:layout_width="660dp"
android:layout_height="45dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<Button
android:visibility="gone"
android:text="添加处方图"
android:id="@+id/btn_dialog_first"
android:background="@drawable/button_rounded_background"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button
android:visibility="gone"
android:text="搜索"
android:id="@+id/btn_dialog_second"
android:background="@drawable/button_rounded_background"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button
android:visibility="gone"
android:text="null"
android:id="@+id/btn_dialog_third"
android:background="@drawable/button_rounded_background"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
<ListView
android:id="@+id/lv_dialog"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
2.MainActivity布局设计
添加一个Button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
//这个按钮样式可以删除使用默认的或者自定义
android:background="@drawable/button_rounded_background"
android:id="@+id/bt_main_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
三、DialogAdapter类,继承BaseAdapter
public class DialogAdapter extends BaseAdapter {
private List<Map<String,Object>> data;
private LayoutInflater layoutInflater;
private Context context;
private onClickListening onClickListening;
//item上按钮功能的接口
public interface onClickListening{
View.OnClickListener onClickListeningItemButton(int position);
}
public DialogAdapter setOnClickListening(onClickListening listening){
this.onClickListening = listening;
return this;
}
//构造函数
public DialogAdapter(Context context,List<Map<String,Object>> data){
this.context = context;
this.data = data;
this.layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//更新ListView界面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String[] strings = new String[3];
strings[0] = "name";
strings[1] = "number";
strings[2] = "size";
DialogListItem dialogListItem = new DialogListItem(strings);
convertView = layoutInflater.inflate(R.layout.dialog_item_style,null);
dialogListItem.tv_dialog_name = convertView.findViewById(R.id.tv_dialog_name);
dialogListItem.tv_dialog_number = convertView.findViewById(R.id.tv_dialog_number);
dialogListItem.tv_dialog_size = convertView.findViewById(R.id.tv_dialog_size);
dialogListItem.btn_dialog_load = convertView.findViewById(R.id.btn_dialog_load);
dialogListItem.tv_dialog_name.setText(data.get(position).get(dialogListItem.datakey[0]).toString());
dialogListItem.tv_dialog_number.setText(data.get(position).get(dialogListItem.datakey[1]).toString());
dialogListItem.tv_dialog_size.setText(data.get(position).get(dialogListItem.datakey[2]).toString());
dialogListItem.btn_dialog_load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickListening.onClickListeningItemButton(position);
}
});
return convertView;
}
}
四.Dialog类
//接口
public interface onClickListenner {
//第一个按钮
void onClickListennerFirst();
//第二个按钮
void onClickListennerSecond();
//第三个按钮
void onClickListennerThird();
//item里面的按钮
void onItemButton(int position);
List<Map<String, Object>> getData();
}
public Dialog setOnClikcListenner(onClickListenner listenner) {
this.onClickListenner = listenner;
return this;
}
public Dialog(@NonNull Context context) {
super(context);
this.context= context;
}
//这里的int i是开启按钮的个数,最多三个 最少0个
public Dialog(@NonNull Context context, int i) {
super(context);
this.context= context;
btnNumber = i;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_dialog);
initView(btnNumber);
initEvent();
dataList = onClickListenner.getData();
showListView(dataList);
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//初始化控件
public void initView(int i) {
int visible = 0;
if (i == 1) {
btn_dialog_first = findViewById(R.id.btn_dialog_first);
btn_dialog_first.setVisibility(visible);
} else if (i == 2) {
btn_dialog_first = findViewById(R.id.btn_dialog_first);
btn_dialog_second = findViewById(R.id.btn_dialog_second);
btn_dialog_first.setVisibility(visible);
btn_dialog_second.setVisibility(visible);
} else {
btn_dialog_first = findViewById(R.id.btn_dialog_first);
btn_dialog_second = findViewById(R.id.btn_dialog_second);
btn_dialog_third = findViewById(R.id.btn_dialog_third);
btn_dialog_first.setVisibility(visible);
btn_dialog_second.setVisibility(visible);
btn_dialog_third.setVisibility(visible);
}
lv_dialog = findViewById(R.id.lv_dialog);
ed_dialog_search =findViewById(R.id.ed_dialog_search);
}
}
//初始化监听事件
public void initEvent() {
//按钮监听
btn_dialog_first.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListenner != null) {
onClickListenner.onClickListennerFirst();
}
}
});
btn_dialog_second.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListenner != null) {
onClickListenner.onClickListennerSecond();
}
}
});
btn_dialog_third.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListenner != null) {
onClickListenner.onClickListennerThird();
}
}
});
//软键盘监听,将EditView里软键盘的回车键改为点击搜索,点击搜索就关闭软键盘
ed_dialog_search.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
ed_dialog_search.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId==EditorInfo.IME_ACTION_SEARCH||(event!=null&&event.getKeyCode()== KeyEvent.KEYCODE_ENTER))
{
//搜索方法
dialogSearch();
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm.isActive()&&getCurrentFocus()!=null){
if (getCurrentFocus().getWindowToken()!=null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
return false;
}
});
//EditText监听,当搜索框内文本被修改就开始检索。
ed_dialog_search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { //搜索方法
dialogSearch();
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
这里分开两个列表更新方法使用,一个是搜索用,防止原本的数据修改。
//更新List,并刷新页面
public void showListView(List<Map<String,Object>> list) {
dataList = list;
dialogAdapter = new DialogAdapter(context, dataList);
dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
@Override
public View.OnClickListener onClickListeningItemButton(int position) {
onClickListenner.onItemButton(position);
return null;
}
});
lv_dialog.setAdapter(dialogAdapter);
//列表监听,长按删除item
lv_dialog.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("TAG", "onItemClick: 点击了 "+list.get(position).get("name"));
}
});
lv_dialog.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
list.remove(position);
dialogAdapter = new DialogAdapter(context, list);
dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
@Override
public View.OnClickListener onClickListeningItemButton(int position) {
onClickListenner.onItemButton(position);
return null;
}
});
lv_dialog.setAdapter(dialogAdapter);
return false;
}
});
}
//仅刷新页面,不修改List数据
public void showListView2(List<Map<String,Object>> list){
dialogAdapter = new DialogAdapter(context, list);
dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
@Override
public View.OnClickListener onClickListeningItemButton(int position) {
onClickListenner.onItemButton(position);
return null;
}
});
lv_dialog.setAdapter(dialogAdapter);
}
//搜索列表的方法,按照name查询
public void dialogSearch(){
String ss = ed_dialog_search.getText().toString();
if (!ss .equals("")){
alist.clear();
for (int i =0;i<dataList.size();i++){
Log.d(TAG, "dialogSearch: "+1);
if (dataList.get(i).get("name").toString().indexOf(ss,dataList.get(i).get("name").toString().length()-1) != -1){
alist.add(dataList.get(i));
}
String[] aa = dataList.get(i).get("name").toString().split(ss);
if (aa.length>1){
alist.add(dataList.get(i));
}
showListView2(alist);
}
}else showListView2(dataList);
}
//添加信息的方法,在MainActivity里面用
public void dialogAdd(Map a){
dataList.add(a);
showListView(dataList);
}
# 五.DialogListItem类
public class DialogListItem {
public TextView tv_dialog_name , tv_dialog_number,tv_dialog_size;
public ImageView ig_dialog_del;
public Button btn_dialog_load;
public String[] datakey;//map数据里面对应的key名
public DialogListItem(String[] s) {
datakey = s;
}
}
五.DialogListItem类
private int btnNumber = 3;
private ListView lv_dialog;
public EditText ed_dialog_search;
private Button btn_dialog_first, btn_dialog_second, btn_dialog_third;
private onClickListenner onClickListenner;
private Context context;
public DialogAdapter dialogAdapter;
List<Map<String,Object>> dataList =new ArrayList<Map<String, Object>>();;//实时的列表
List<Map<String, Object>> alist = new ArrayList<Map<String, Object>>();//查询用list
六.MainActivity功能实现
1.初始化控件,这里不展示代码。
2.功能实现
View.OnClickListener l = new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialog dialog = new Dialog(MainActivity.this);
dialog.setTitle("Test");
dialog.setOnClikcListenner(new Dialog.onClickListenner() {
int i = 0;
@Override
public void onClickListennerFirst() {
Map<String, Object> map = new HashMap<String, Object>();
i++;
String a = "测试"+i;
map.put("name",a);
map.put("size","100kb");
map.put("number",i);
Log.d(TAG, "onClickListennerFirst: " +map);
dialog.dialogAdd(map);
mToast("添加成功");
}
@Override
public void onClickListennerSecond() {
dialog.dialogSearch();
mToast("搜索完成");
}
@Override
public void onClickListennerThird() {
}
@Override
public void onItemButton(int position) {
}
//ListView里面List的数据
@Override
public List<Map<String, Object>> getData() {
return list;
}
});
dialog.show();
}
};
//冒泡消息
public void mToast(String text) {
if (mToast == null) {
mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
} else {
mToast.setText(text);
}
mToast.show();
}