最近在做Android APP的开发,对用到的开发技术做一个总结。
大量结构化数据的展示:
可以使用RecyclerViewadaper实现。
结构化数据可以用一个类封装起来,作为构造构造adapter的数据来源。
public class RecyclerViewDepartmentAdapter extends RecyclerView.Adapter<RecyclerViewDepartmentAdapter.ViewHolder> {
private Context context;
private List<Department> data;
public RecyclerViewDepartmentAdapter(Context context,List<Department> data){
this.context = context;
this.data = data;
}
@Override
public RecyclerViewDepartmentAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerViewDepartmentAdapter.ViewHolder holder = new RecyclerViewDepartmentAdapter.ViewHolder(LayoutInflater.from(
context).inflate(R.layout.item_layout_department, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewDepartmentAdapter.ViewHolder holder, final int position) {
final Context context = this.context;
holder.id.setText(data.get(position).getId());
holder.department.setText(data.get(position).getDepartmentName());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("gwj","这里是点击每一行item的响应事件" + position + "item");
}
});
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
private TextView id;
private TextView department;
public ViewHolder(View itemView) {
super(itemView);
id = itemView.findViewById(R.id.id);
department = itemView.findViewById(R.id.department);
}
}
}
如上面代码所示,构造函数传入的数据是封装好的类的list。
可以对每一行的点击进行相应。
弹出式菜单
PopupMenu popup = new PopupMenu(context, v);//第二个参数是绑定的那个view
//获取菜单填充器
MenuInflater inflater = popup.getMenuInflater();
//填充菜单
inflater.inflate(R.menu.menu_department, popup.getMenu());
//绑定菜单项的点击事件
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false
}
});
菜单需要事先在xml中定义
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/add_department"
android:title="增加条目"/>
<item android:id="@+id/del_department"
android:title="删除条目"/>
</menu>
简单对话框
//弹出对话框,消息框,确认是否删除
final AlertDialog.Builder normalDialog =
new AlertDialog.Builder(context);
//normalDialog.setIcon(R.drawable.icon_dialog);
normalDialog.setTitle("是否确定删除该部门?");
normalDialog.setMessage("确认:删除,取消:不执行任何操作");
normalDialog.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("ggg","删除了一个条目!");
}
});
normalDialog.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("ggg","没有执行删除操作!");
}
});
// 显示
normalDialog.show();
自定义对话框
xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="300dp"
android:layout_height="600dp"
android:layout_centerInParent="true"
android:background="#44ffff"
android:orientation="vertical">
<!--用户名-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_name_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="用户名:"
android:textColor="#000000"
android:textSize="20dp" />
<EditText
android:id="@+id/person_name_edit"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:textColor="#CD3700"
android:textSize="20dp" />
</LinearLayout>
<!--手机-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_phone_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="手机号:"
android:textColor="#000000"
android:textSize="20dp" />
<EditText
android:id="@+id/person_phone_edit"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:textColor="#CD3700"
android:textSize="20dp" />
</LinearLayout>
<!--邮箱-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_email_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="邮箱号:"
android:textColor="#000000"
android:textSize="20dp" />
<EditText
android:id="@+id/person_email_edit"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:textColor="#CD3700"
android:textSize="20dp" />
</LinearLayout>
<!--权限-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_permission_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="权限:"
android:textColor="#000000"
android:textSize="20dp" />
<Spinner
android:id="@+id/person_permission_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="5dp"
android:textAlignment="gravity"
/>
</LinearLayout>
<!--部门-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_department_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="部门名称:"
android:textColor="#000000"
android:textSize="20dp" />
<Spinner
android:id="@+id/person_department_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@color/white"
android:textAlignment="gravity"
/>
</LinearLayout>
<!--密码-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/person_password_label"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="密码:"
android:textColor="#000000"
android:textSize="20dp" />
<EditText
android:id="@+id/person_password_edit"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:textColor="#CD3700"
android:textSize="20dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button_confirm"
android:layout_width="@dimen/dp_150"
android:layout_height="wrap_content"
android:text="确认" />
<Button
android:id="@+id/button_cancle"
android:layout_width="@dimen/dp_150"
android:layout_height="wrap_content"
android:text="取消" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
对话框样式
<style name="MyDialog" parent="android:Theme.Dialog">
<!-- 背景颜色及透明程度 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 是否半透明 -->
<item name="android:windowIsTranslucent">false</item>
<!-- 是否没有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否背景模糊 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 设置背景模糊的透明度-->
<item name="android:backgroundDimAmount">0.5</item>
</style>
类实现
public class PersonDialog extends Dialog{
//在构造方法里提前加载了样式
private Context context;//上下文
private Button button_confirm;
private Button button_cancle;
private Person person;
public EditText editText_name;
public EditText editText_phone;
public EditText editText_email;
public EditText editText_password;
public Spinner spinner_permission;
public Spinner spinner_department;
public PersonDialog(Context context, Person person){
super(context, R.style.MyDialog);//加载dialog的样式
this.context = context;
this.person = person;
}
public interface OnDialogButtonClickListener {
void okButtonClick();
void cancelButtonClick();
}
OnDialogButtonClickListener buttonClickListner;
public void setOnButtonClickListener(OnDialogButtonClickListener listener) {
this.buttonClickListner = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//提前设置Dialog的一些样式
Window dialogWindow = getWindow();
dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中
//dialogWindow.setWindowAnimations();设置动画效果
setContentView(R.layout.dialog_person);
WindowManager windowManager = ((Activity)context).getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5
getWindow().setAttributes(lp);
setCanceledOnTouchOutside(true);//点击外部Dialog消失
//遍历控件id添加点击注册
button_confirm = findViewById(R.id.button_confirm);
button_cancle = findViewById(R.id.button_cancle);
button_confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buttonClickListner.okButtonClick();
}
});
button_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buttonClickListner.cancelButtonClick();
}
});
//显示控件
editText_name = findViewById(R.id.person_name_edit);
editText_phone = findViewById(R.id.person_phone_edit);
editText_email = findViewById(R.id.person_email_edit);
editText_password = findViewById(R.id.person_password_edit);
spinner_department = findViewById(R.id.person_department_spinner);
spinner_permission = findViewById(R.id.person_permission_spinner);
}
}
类使用
final PersonDialog personDialog1 = new PersonDialog(context,person1);
personDialog1.setOnButtonClickListener(new PersonDialog.OnDialogButtonClickListener() {
@Override
public void okButtonClick() {
personDialog1.dismiss();
}
@Override
public void cancelButtonClick() {
personDialog1.dismiss();
}
});
personDialog1.show();
这里使用Listener,在类的外部实现按钮的相应代码。
下拉列表
spinner_department = findViewById(R.id.person_department_spinner);
final DepartmentDao departmentDao = new DepartmentDao(context);
List<Department> ld = departmentDao.getDepartments();
List<String> list1 = new ArrayList<>();
for(int i = 0;i<ld.size();i++) {
list1.add(ld.get(i).getDepartmentName());
}
ArrayAdapter<String> adapter_department = new ArrayAdapter<String>(context,R.layout.item_gwj_register_org, R.id.text,list1);
spinner_department.setAdapter(adapter_department);
把从数据库中查询到内容显示到下拉列表中