1. AlertDialog 提示对话框
使用方法:
实例化一个提示对话框对象
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
//为对话框设置标题和显示内容
dialog.setTitle("FBI Warning");
dialog.setMessage("The video only be show in family!");
//设置该对话框是否可以通过返回键退出
dialog.setCancelable(false);
//设置OK和Cancel按钮并通过匿名内部类设置监听器
//Positive意思为正,Negative为负
dialog.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//选择OK按钮的操作
}
});
dialog.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//选择Cancel按钮的操作
}
});
//将设置好的对话框显示在Activity中
dialog.show();
2. ProgressDialog 进度条对话框
使用方法类似于上一个
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("FBI Warning");
progressDialog.setMessage("Wait a moment pls");
progressDialog.setCancelable(false);
//显示进度条对话框
progressDialog.show();
//关闭进度条对话框
/**
*如果设置显示对话框并且禁止使用返回键退出的话
*必须在耗时操作结束后使用dismiss()手动终止进度条对话框,
*否则程序将进入死循环
*/
progressDialog.dismiss();
3. 自定义控件
- 引入布局
这个很简单。只需要事先写好一个布局文件,然后直接在另一个xml文件中引用就行
//引入事先写好的test布局
<include layout = "@layout/test"
- 自定义控件
布局写好之后,我们需要创建一个对应布局的自定义类
自定义类
//关于继承类选择继承自定义控件的布局比如LinearLayout
public class TitleLayout extends LinearLayout {
public TestLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//使用LayoutInflater.from(context)实例化一个LayoutInflater对象
//然后使用inflate()方法动态加载一个title布局,这里的this是指加载这个布局的容器
//而容器是指实例化这个控件的容器分配给它的空容器,然后inflate在这个容器中绘制R.layout.test布局
LayoutInflater.from(context).inflate(R.layout.test,this);
}
}
4. ListView的第二种使用办法
- 构建列表项数据实体类,比如这样的:
package com.listview_and_recycleview;
public class Fruit {
private String name;
private int imageId;
public Fruit(String name,int imageId){
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public int getImageId() {
return imageId;
}
}
- 自定义适配器
public class FruitAdapter extends ArrayAdapter<Fruit> {
//使用resourceId传递布局ID用于动态加载布局
private int resourceId;
public FruitAdapter(Context context, int resourceId, List<Fruit> objects) {
super(context, resourceId,objects);
this.resourceId = resourceId;
}
@Override
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
//获取当前列表项应该显示的数据
Fruit fruit = getItem(position);
View view ;
//优化1:判断要显示的布局是否已缓存在convertView中来减少重新加载布局继而保证listView的运行效率
//优化2:使用自定义内部类ViewHolder缓存控件实例以避免重复调用findViewId()方法
ViewHolder viewHolder;
//优化1*
if(convertView==null){
//动态加载一个ListView列表项的布局
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
//优化2*
viewHolder = new ViewHolder();
viewHolder.fruitImage = view.findViewById(R.id.fruit_image);
viewHolder.fruitName = view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}else{
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
//返回绘制好的view
return view;
}
//自定义内部类ViewHolder
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
}
- 书写列表项布局文件
- 在Activity的java文件中设置ListView并为其设置点击事件监听器
//通过自定义函数初始化测试数据列表fruitList的数据
initFruitData();
//实例化自定义适配器FruitAdapter
FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
final ListView listView = findViewById(R.id.list_view_Main);
listView.setAdapter(adapter);
//设置监听器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, fruitList.get(i).getName(), Toast.LENGTH_SHORT).show();
}
});
5. RecycleView的使用
在使用RecycleView控件之前需要导入对应的库文件,这个只需要添加一下配置文件参数即可。在当前应用目录下的build.gradle文件中dependencies部分添加如下代码:
implementation 'androidx.recyclerview:recyclerview:1.0.0'
- 在布局文件中通过以下方法添加RecycleView,因为是外部导入的包,所以需要写下完整的包路径
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycleView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 构建列表项数据实体类,参照上面ListView
- 自定义适配器,写法与ListView的有很大不同,感觉有点像是BaseAdapter的用法
public class Fruit_R_Adapter extends RecyclerView.Adapter<Fruit_R_Adapter.ViewHolder> {
private List<Fruit> mFruitList;
//构造函数,将数据传进来放到mFruitList中
public Fruit_R_Adapter(List<Fruit> fruitList){
mFruitList = fruitList;
}
//自定义静态内部类ViewHolder,继承自RecyclerView.ViewHolder,
// 将对应列表项内部控件通过构造函数放到ViewHolder中
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView fruitImage;
TextView fruitName;
View fruitView;
public ViewHolder(View view){
super(view);
fruitView = view;
fruitImage = view.findViewById(R.id.fruit_image);
fruitName = view.findViewById(R.id.fruit_name);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
//通过inflate方法动态加载布局,并通过实例化一个ViewHolder获取到当前列表项布局内部控件
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
//因为RecycleView的内部控件监听器无法通过使用RecycleView.控件id.setOnClickListener来设置,所以需要在这里书写对应控件的监听器
viewHolder.fruitView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "you clicked this view", Toast.LENGTH_SHORT).show();
}
});
viewHolder.fruitImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "you click this image", Toast.LENGTH_SHORT).show();
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//获取到对应位置position的数据并通过一个ViewHolder实例holder获取到列表项内部控件将数据填充到对应控件中
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
}
@Override
public int getItemCount() {
//返回数据内部数据组个数,即列表项数目
return mFruitList.size();
}
}
- 书写列表项布局文件
- 在Activity的java文件中设置RecycleView
//通过自定义函数初始化测试数据列表fruitList的数据
initFruitData();
RecyclerView recyclerView = findViewById(R.id.recycleView);
//实例化一个线性布局管理器LinearLayoutManager作为RecycleView的布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
Fruit_R_Adapter adapter = new Fruit_R_Adapter(fruitList);
recyclerView.setAdapter(adapter);
另外,如果想使列表项横向滚动的话只需要更改列表项的布局文件使其适合横向滚动布局,然后将 LinearLayoutManager的orientation属性设置为horizontal即可。而如果想使用瀑布式布局的话,不仅需要更改布局文件,还需要将LinearLayoutManager更改为StaggeredGridLayoutManager:
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);