Activity
(从活动的状态,再到活动的生命周期,以及活动的启动模式)
Activity
是一个非常重要的组件,它代表了一个用户可以交互的屏幕
活动状态
栈
- 其实 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中人栈,并处于栈顶的位置。而每当我们按下 Back 键或调用 finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个人栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
运行状态(Running)
- 当Activity位于任务栈的顶部,并且用户正在与之交互时,该Activity处于运行状态。它是前台活动,可以处理用户的输入事件。
暂停状态(Paused)
- 当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。当一个新的非全屏的Activity(如对话框)被放置在顶层时,或者当另一个Activity被透明地放置在它上面时,当前的Activity会进入暂停状态。
停止状态(Stopped)
- 当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。在停止状态下,Activity仍然保留其所有状态和成员信息,但它不会接收用户输入,也不会执行任何代码(除非由系统调用其生命周期方法)。
销毁状态(Killed)
- 当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。
- 当系统需要回收内存时,可能会杀死(销毁)处于停止状态的Activity。被销毁的Activity在需要时无法被恢复,因为它不再存在于内存中。但是,如果Activity配置了合适的保存和恢复机制(如在onSaveInstanceState()中保存数据),那么当用户再次导航回该Activity时,它可以被重新创建,并且其之前的状态可以被恢复
活动生命周期
7个回调方法
onCreate(Bundle savedInstanceState)
:当Activity被创建时调用。onStart()
:当Activity对用户可见时调用。onResume()
:当Activity开始与用户交互时调用。onPause()
:当Activity不再与用户交互(如另一个Activity即将开始)时调用。onStop()
:当Activity不再对用户可见时调用。onDestroy()
:当Activity即将被销毁时调用。onRestart()
:当Activity从停止状态重新启动时调用(跟随onStart()
)。
3种生存期
-
完整生存期:活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
-
可见生存期:活动在onstart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。
-
前台生存期:活动在 onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的也就是这个状态下的活动。
思考
1.什么时候pause(),什么时候用stop()
- 当Activity不再处于前台,但仍然可见时。例如开启一个一个不完全覆盖屏幕的Activity与用户交互,被覆盖的Activity属于Pause()。
- 当Activity不再可见时(即完全被另一个Activity覆盖),系统会调用Activity的
onStop()
方法。通常发生在用户切换到另一个应用、当前应用被关闭或Activity被销毁时
2.什么时候resume(),什么时候start()
- resume():当Activity再次回到前台时,系统会调用Activity的
onResume()
方法。这通常发生在用户从主屏幕或另一个Activity返回到这个Activity时。在onResume()
方法中,你应该进行初始化Activity界面的操作,因为此时Activity已经准备好与用户交互。 - start():
start()
方法实际上是用于启动或重新启动一个Activity的。当你想要从一个Activity跳转到另一个Activity时,你应该调用startActivity(Intent)
或startActivityForResult(Intent, int)
方法,并传入一个Intent对象,指明要启动的Activity。这并不会直接调用Activity的start()
方法,但会导致目标Activity的onCreate()
、onStart()
和onResume()
方法被调用(如果目标Activity尚未存在)。
活动的启动模式
standard(标准模式)
- 每次启动Activity时都会创建一个新的实例。
singleTop(栈顶复用模式)
- 如果新的Activity已经位于任务栈的顶部,则不会创建新的实例,而是调用该实例的
onNewIntent()
方法。
singleTask(栈内复用模式)
- 启动Activity时,系统会在任务栈中查找是否已经存在该Activity的实例。如果存在,则将该Activity之上的所有Activity移出栈,并通过
onNewIntent()
方法将意图传递给该实例。如果不存在,则创建新的实例。
singleInstance(单实例模式)
- 类似于
singleTask
,但系统会为Activity创建一个新的任务,并且该任务中仅包含此Activity的一个实例。其他应用不能启动该Activity的实例
Fragment
- 定义:Fragment 是一个可以嵌入到Activity中的UI组件
碎片状态
运行状态(Resumed)
- 当Fragment对用户可见并且正在与用户进行交互时,Fragment处于运行状态=。
- 在这个状态下,Fragment的视图已经存在,并且已经准备好响应用户的操作。
- Fragment的
onResume()
方法已经被调用,并且Fragment的生命周期与宿主Activity的运行状态同步。
暂停状态(Paused)
- 当Fragment对用户仍然可见,但无法与用户进行交互时(例如,宿主Activity被另一个非全屏的Activity部分覆盖时),Fragment处于暂停状态。
- 尽管Fragment的视图仍然可见,但系统可能会停止动画、处理器密集型任务等,以节省资源。
- Fragment的
onPause()
方法已经被调用,但Fragment的实例仍然存在,并且可以在未来恢复。
停止状态(Stopped)
- 当Fragment不再对用户可见时(例如,宿主Activity被另一个Activity完全覆盖时),Fragment处于停止状态。
- 在这个状态下,Fragment的视图已经被销毁(除非Fragment被明确设置为保留其视图,即使用了
setRetainInstance(true)
),但Fragment的实例仍然存在。 - Fragment的
onStop()
方法已经被调用,但Fragment仍然可以接收来自宿主Activity的回调,如onConfigurationChanged()
(如果Fragment设置了适当的配置监听器)。
销毁状态(Destroyed)
- 当Fragment不再需要并且其资源被完全释放时,Fragment处于销毁状态。
- Fragment的
onDestroy()
方法已经被调用,这标志着Fragment的生命周期结束。 - 在销毁状态下,Fragment的实例不再存在,除非它之前被
detach()
而不是remove()
,这样Fragment的实例仍然保留在FragmentManager中,可以在未来重新附加到Activity中。
碎片的生命周期
Fragment的生命周期与Activity的生命周期类似,但更为复杂,因为它必须处理与宿主Activity的交互。Fragment的生命周期方法包括(11个):
-
onAttach(Context context)
:当Fragment与Activity关联时调用。 -
onCreate(Bundle savedInstanceState)
:创建Fragment时调用。 -
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
:创建Fragment的视图时调用。 -
onActivityCreated(Bundle savedInstanceState)
:当Activity的onCreate()
方法返回时调用。 -
onStart()
:Fragment对用户可见时调用。 -
onResume()
:Fragment可以开始与用户交互时调用。 -
onPause()
:用户离开Fragment时调用。 -
onStop()
:Fragment不再对用户可见时调用。 -
onDestroyView()
:Fragment的视图被销毁时调用。 -
onDestroy()
:Fragment被销毁时调用。 -
onDetach()
:Fragment与Activity分离时调用。
碎片的静态添加
静态添加Fragment通常是在Activity的布局文件中通过<fragment>
标签直接声明的。这种方式下,Fragment与Activity一起创建,并且Fragment的生命周期与Activity紧密绑定
- 在一个Activity中加载一个左Fragment,再加载一个右Fragment。左Fragment,右Fragment的布局文件可为简单的LinearLayout布局
- Fragment中 的 onCreateView()方法,然后在这个方法中通过 Layoutlnflater的 inflate()方法将刚才定义的left fagment布局动态加载进来。
- 但是在Activity的布局文件中,需要手动添加Frament, android:name 属性来显式指明要添加的碎片类名
碎片的动态添加
动态添加Fragment是通过编程方式在Activity的代码中完成的。这通常涉及到以下几个步骤:
-
创建Fragment实例。获取FragmentManager,在活动中可以直接通过调用 getSupportFragmentManager()方法得到。
-
开启一个事务,创建一个
FragmentTransaction
对象,通过调用 beginTransaction()方法开启。也可用于管理Fragment的添加、移除等操作。 -
使用
FragmentTransaction
的方法(如add()
、replace()
等)来添加或替换Fragment。 -
提交
FragmentTransaction
,调用commit()方法来完成。//在Activity中显示Fragment //1、获取Fragment管理器 FragmentManager FragmentManager fragmentManager = this.getFragmentManager(); //2、开启fragment事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); //==添加Fragment对象到Fragment事务中 //3、参数:显示Fragment的容器的ID,Fragment对象 transaction.add(R.id.ll_main_content, fragments[fragmentIndex]); //4、显示Fragment transaction.show(fragments[fragmentIndex]); //5、提交事务 transaction.commit();
限定符
在Fragment中“限定符”的概念实际上是通过在Fragment中根据设备的不同配置来动态调整其行为或布局来实现的
- 根据条件加载不同的布局。在Fragment的
onCreateView
方法中,可以根据当前的设备配置(如屏幕尺寸、方向等)来选择加载哪个布局文件。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
int layoutId;
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
layoutId = R.layout.fragment_landscape;
} else {
layoutId = R.layout.fragment_portrait;
}
return inflater.inflate(layoutId, container, false);
}
- 通过Fragment参数或宿主Activity传递配置信息:
如果Fragment需要根据特定的配置来显示不同的内容或行为,你可以通过向Fragment传递参数(如通过Bundle
在创建Fragment时)或让宿主Activity将配置信息传递给Fragment(例如,通过接口回调)。
ListView
(思考LayoutInflater使用Inflate()方法,内部类 ViewHolder,用于对控件的实例进行缓存)
ListView 是 Android 中用于显示列表项的一个组件,它继承自 AbsListView
。ListView 允许你展示一个可滚动的列表项集合,每个列表项都可以是自定义的视图。
具体实现步骤:
-
接着定义一个实体类,作为 ListView适配器的适配类型。新建类Goods(bean)
-
设定好布局文件
-
创建自定义Adapter继承与ArrayAdapter(适配器文件)
-
在 getView()方法中,首先通过getItem()方法得到当前项的 实例,
-
LayoutInflater使用Inflate()方法来为这个子项加载我们传入的布局。
-
接下来调用View的findViewById()方法分别获取到mageView 和TextView 的实例,
-
并分别调用它们的setImageResource()和 setText()方法来设置显示的图片和文字,最后将布局返回,这样我们自定义的适配器就完成了。
Adapter的相关代码
@0verride public View getView(int position, View convertView, ViewGroup parent){ Fruit fruit = getItem(position);// 获取当前项的 Fruit 实例 View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); ImageView fruitImage =(ImageView)view.findViewById(R.id.fruit image); TextView fruitName =(TextView)view.findViewById(R.id.fruit name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName()); return view;
-
创建一个ListView,Fruit实类的ArrayList数组存储,加载适配器到ListView。
附加:
-
调用 inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的 id,,第二个参数是给加载好的布局再添加一个父布局。
-
getView()方法中还有一个convertView 参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。
-
新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。
-
调用 View的 setTag()方法,将ViewHolder对象存储在 View中
-
当convertView不为 null 的时候则调用 View 的 getTag()方法,把 ViewHolder 重新取出。
- ListView的点击监听事件
-
RecyclerView 是 Android L(API 级别 21)引入的一个更灵活、更强大的列表组件,用于展示大量数据集。它不仅可以实现垂直滚动列表,还可以实现水平滚动列表、网格布局等
具体实现步骤:
-
接着定义一个实体类,作为 RecyclerView适配器的适配类型。新建类Goods(bean)
-
设定好布局文件
-
创建自定义Adapter适配器继承自RecyclerView.Adapter,并将泛型指定为 FruitAdapter.ViewHolder。其中,ViewHolder是我们在 FruitAdapter中定义的一个内部类
-
ViewHolder定义的一个内部类,加载布局页面的控件,点击事件它可以轻松实现子项中任意控件或布局的点击事件。
public class ViewHolder extends RecyclerView.ViewHolder { private TextView title; private TextView price; private ImageView img; public ViewHolder(@NonNull View itemView) { super(itemView); title = itemView.findViewById(R.id.title); price = itemView.findViewById(R.id.tv_price); img = itemView.findViewById(R.id.img); } }
-
onCreate-ViewHolder()方法是用于创建 ViewHolder 实例的,我们在这个方法中将item布局加载进来,然后创建一个 ViewHolder 实例,并把加载出来的布局传入到构造函数当中,最后将ViewHolder 的实例返回。
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { mActivity = viewGroup.getContext(); View view= LayoutInflater.from(mActivity).inflate(R.layout.item_goods_list,viewGroup,false); return new ViewHolder(view); }
-
onBindViewHolder()方法是用于对 RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行,这里我们通过 position 参数得到当前项的 Goods实例,然后再将数据设置到 ViewHolder的ImageView和 TextView当中即可。
public void onBindViewHolder(@NonNull ViewHolder holder, int i) { Goods goods=list.get(i); if(goods!=null){ holder.title.setText(goods.getTitle()); holder.price.setText(String.format("¥%s",goods.getPrice())); Glide.with(mActivity) .asBitmap() .load(goods.getImg()) .error(R.drawable.ic_error) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE)//缓存 .into(holder.img);
-
getItemCount()方法,它用于告诉 RecyclerView 一共有多少子项,直接返回数据源的长度就可以了。
public int getItemCount() { return list.size(); }
- 在activity/Fragment中加载布局及适配器
-
创建了一个 LinearLayoutManager 对象,并将它设置到 RecyclerView当中。
LinearLayoutManager layoutManager=new LinearLayoutManager(myActivity);
-
LayoutManager用于指定 RecyclerView的布局方式,这里使用的 LinearLayoutManager是线性布局的意思。
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
-
设置RecyclerView的布局管理
rvgoodsList.setLayoutManager(layoutManager);
-
创建Adapter的实列,将数据传输给Adapter的构造函数中
mgoodsAdapter=new GoodsAdapter(llEmpty,rvgoodsList);
-
设置recyclerView的适配器
rvgoodsList.setAdapter(mgoodsAdapter);
附加:
-
横向滚动:调用 LinearLayoutManager的setOrientation()方法来设置布局的排列方向,默认是纵向排列的,我们传人 LinearLayoutManager.HORIZONTAL 表示让布局横行排列,这样RecyclerView就可以横向滚动了。
-
瀑布流:首先,在onCreate()方法中,我们创建了一个StaggeredGridLayoutManager 的实例。StaggeredGridLayoutManager 的构造函数接收两个参数,第一个参数用于指定布局的列数传入3表示会把布局分为3列;第二个参数用于指定布局的排列方向,传入StaggeredGrid-LayoutManager.VERTICAL 表示会让布局纵向排列,最后再把创建好的实例设置到 RecyclerView当中就可以了。
StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
- 点击事件:可使用ViewHolder中的实列,实现点击子项中的布局的点击事件。
-
项目相关案例
流程图
从数据库中提取商品相关数据并显示在Activity中的列表中。
相关代码:
Goods
public class Goods extends DataSupport implements Serializable {
private Integer typeId;//类型
private String title;//标题
private String img;//图片
private String content;//内容
private String price;//价格
private String date;//时间
public Integer getTypeId() {
return typeId;
}
public void setTypeId(Integer typeId) {
this.typeId = typeId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Goods(Integer typeId, String title, String img, String content, String price, String date) {
this.typeId = typeId;
this.title = title;
this.img = img;
this.content = content;
this.price = price;
this.date = date;
}
}
Goodsitem
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:background="@color/colorWhite"
android:layout_marginTop="10dp">
<ImageView
android:id="@+id/img"
android:layout_width="130dp"
android:layout_height="100dp"
android:scaleType="centerCrop"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="标题"
android:textSize="16sp"
android:textColor="@color/colorBlack"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_price"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginRight="15dp"
android:gravity="right"
android:textColor="#FF0C34"
android:textSize="15sp"
android:text="28.88"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
GoodsAdapter
public class GoodsAdapter extends RecyclerView.Adapter<GoodsAdapter.ViewHolder> {
private List<Goods> list =new ArrayList<>();
private Context mActivity;
private ItemListener itemListener;
private LinearLayout llEmpty;
private RecyclerView rvgoodsList;
public void setItemListener(ItemListener itemListener){
this.itemListener=itemListener;
}
public interface ItemListener{
void ItemClick(Goods goods);
}
public GoodsAdapter(LinearLayout llEmpty,RecyclerView rvgoodsList){
this.llEmpty=llEmpty;
this.rvgoodsList=rvgoodsList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
mActivity = viewGroup.getContext();
View view= LayoutInflater.from(mActivity).inflate(R.layout.item_goods_list,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
Goods goods=list.get(i);
if(goods!=null){
holder.title.setText(goods.getTitle());
holder.price.setText(String.format("¥%s",goods.getPrice()));
Glide.with(mActivity)
.asBitmap()
.load(goods.getImg())
.error(R.drawable.ic_error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)//缓存
.into(holder.img);
Boolean isAdmin = (Boolean) SPUtils.get(mActivity,SPUtils.IS_ADMIN,false);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(itemListener!=null){
itemListener.ItemClick(goods);
}
}
});
if (isAdmin){
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
dialog.setMessage("确认要删除该商品吗?");
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
list.remove(goods);
goods.delete();
notifyDataSetChanged();
Toast.makeText(mActivity,"删除成功", Toast.LENGTH_LONG).show();
if (list!=null && list.size() > 0){
rvgoodsList.setVisibility(View.VISIBLE);
llEmpty.setVisibility(View.GONE);
}else {
rvgoodsList.setVisibility(View.GONE);
llEmpty.setVisibility(View.VISIBLE);
}
}
});
dialog.setNeutralButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return false;
}
});
}
}
}
@Override
public int getItemCount() {
return list.size();
}
public void addItem(List<Goods> listAdd) {
//如果是加载第一页,需要先清空数据列表
this.list.clear();
if (listAdd!=null){
//添加数据
this.list.addAll(listAdd);
}
//通知RecyclerView进行改变--整体
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private TextView price;
private ImageView img;
public ViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
price = itemView.findViewById(R.id.tv_price);
img = itemView.findViewById(R.id.img);
}
}
}
GoodsFragment
public class GoodsFragment extends Fragment {
private Activity myActivity;//上下文
private TabLayout tabTitle;
private RecyclerView rvgoodsList;
private GoodsAdapter mgoodsAdapter;
private LinearLayout llEmpty;
private Boolean mIsAdmin;
private EditText etQuery;//搜索内容
private ImageView ivSearch;//搜索图标
private FloatingActionButton btnAdd;
private String[] state = {"0", "1", "2", "3", "4", "5"};
private String[] title = {"女士服饰", "男士服饰", "运动鞋类", "运动装备", "智能装备", "健康食品"};
private String typeId = "0";
private List<Goods> mgoods;
@Override
public void onAttach(Context context) {
super.onAttach(context);
myActivity = (Activity) context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_goods, container, false);
tabTitle = (TabLayout) view.findViewById(R.id.tab_title);
rvgoodsList = (RecyclerView) view.findViewById(R.id.rv_goods_list);
llEmpty = view.findViewById(R.id.ll_empty);
etQuery = view.findViewById(R.id.et_query);
ivSearch = view.findViewById(R.id.iv_search);
btnAdd = (FloatingActionButton) view.findViewById(R.id.btn_add);
//获取控件
initView();
loadData();
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(myActivity, AddGoodsActivity.class);
startActivityForResult(intent,100);
}
});
//软键盘搜索
ivSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadData();//加载数据
}
});
//点击软键盘中的搜索
etQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
KeyBoardUtil.hideKeyboard(v);//隐藏软键盘
loadData();//加载数据
return true;
}
return false;
}
});
return view;
}
private void initView() {
mIsAdmin = (Boolean) SPUtils.get(myActivity, SPUtils.IS_ADMIN, false);
btnAdd.setVisibility(mIsAdmin? View.VISIBLE: View.GONE);
tabTitle.setTabMode(TabLayout.MODE_SCROLLABLE);//可滚动
//为TabLayout添加tab名称
for (int i=0;i<title.length;i++){
tabTitle.addTab(tabTitle.newTab().setText(title[i]));
}
LinearLayoutManager layoutManager=new LinearLayoutManager(myActivity);
//=1.2、设置为垂直排列,用setOrientation方法设置(默认为垂直布局)
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//=1.3、设置recyclerView的布局管理器
rvgoodsList.setLayoutManager(layoutManager);
//==2、实例化适配器
//=2.1、初始化适配器
mgoodsAdapter=new GoodsAdapter(llEmpty,rvgoodsList);
//=2.3、设置recyclerView的适配器
rvgoodsList.setAdapter(mgoodsAdapter);
loadData();
mgoodsAdapter.setItemListener(new GoodsAdapter.ItemListener() {
@Override
public void ItemClick(Goods goods) {
boolean isAdmin = (boolean) SPUtils.get(myActivity,SPUtils.IS_ADMIN,false);
String account = (String) SPUtils.get(myActivity,SPUtils.ACCOUNT,"");
if ("".equals(account)) {//未登录,跳转到登录页面
MyApplication.Instance.getMainActivity().finish();
startActivity(new Intent(myActivity, LoginActivity.class));
}else {//已经登录
Intent intent;
if (isAdmin){
intent = new Intent(myActivity, AddGoodsActivity.class);
}else {
intent = new Intent(myActivity, GoodsDetailActivity.class);
}
intent.putExtra("goods",goods);
startActivityForResult(intent,100);
}
}
});
tabTitle.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
typeId = state[tab.getPosition()];
loadData();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void loadData(){
String content=etQuery.getText().toString();//获取搜索内容
if ("".equals(content) ){
mgoods = DataSupport.where("typeId = ?",typeId).find(Goods.class);
}else {
mgoods =DataSupport.where("typeId = ? and title like ?" ,typeId,"%"+content+"%").find(Goods.class);//通过标题模糊查询留言
}
if (mgoods !=null && mgoods.size()>0){
rvgoodsList.setVisibility(View.VISIBLE);
llEmpty.setVisibility(View.GONE);
mgoodsAdapter.addItem(mgoods);
}else {
rvgoodsList.setVisibility(View.GONE);
llEmpty.setVisibility(View.VISIBLE);
}
}
@Override
public void onResume() {
super.onResume();
loadData();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == RESULT_OK){
loadData();//加载数据
}
}
MainActivity
/**
* 方法 - 切换Fragment
*
* @param fragmentIndex 要显示Fragment的索引
*/
private void switchFragment(int fragmentIndex) {
//在Activity中显示Fragment
//1、获取Fragment管理器 FragmentManager
FragmentManager fragmentManager = this.getFragmentManager();
//2、开启fragment事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
//懒加载 - 如果需要显示的Fragment为null,就new。并添加到Fragment事务中
if (fragments[fragmentIndex] == null) {
if (mIsAdmin){
switch (fragmentIndex) {
case 0://NewsFragment
fragments[fragmentIndex] = new FruitFragment();
break;
case 1://CollectFragment
fragments[fragmentIndex] = new CarFragment();
break;
case 2://UserManageFragment
fragments[fragmentIndex] = new OrderFragment();
break;
case 3://UserFragment
fragments[fragmentIndex] = new UserFragment();
break;
}
}else {
switch (fragmentIndex) {
case 0://NewsFragment
fragments[fragmentIndex] = new FruitFragment();
break;
case 1://CollectFragment
fragments[fragmentIndex] = new CarFragment();
break;
case 2://UserManageFragment
fragments[fragmentIndex] = new OrderFragment();
break;
case 3://UserFragment
fragments[fragmentIndex] = new UserFragment();
break;
}
}
//==添加Fragment对象到Fragment事务中
//参数:显示Fragment的容器的ID,Fragment对象
transaction.add(R.id.ll_main_content, fragments[fragmentIndex]);
}
//隐藏其他的Fragment
for (int i = 0; i < fragments.length; i++) {
if (fragmentIndex != i && fragments[i] != null) {
//隐藏指定的Fragment
transaction.hide(fragments[i]);
}
}
//4、显示Fragment
transaction.show(fragments[fragmentIndex]);
//5、提交事务
transaction.commit();
}