Activity、Fregment、LIstView、RecyclerView及使用案例

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紧密绑定

  1. 在一个Activity中加载一个左Fragment,再加载一个右Fragment。左Fragment,右Fragment的布局文件可为简单的LinearLayout布局
  2. Fragment中 的 onCreateView()方法,然后在这个方法中通过 Layoutlnflater的 inflate()方法将刚才定义的left fagment布局动态加载进来。
  3. 但是在Activity的布局文件中,需要手动添加Frament, android:name 属性来显式指明要添加的碎片类名

碎片的动态添加

动态添加Fragment是通过编程方式在Activity的代码中完成的。这通常涉及到以下几个步骤:

  1. 创建Fragment实例。获取FragmentManager,在活动中可以直接通过调用 getSupportFragmentManager()方法得到。

  2. 开启一个事务,创建一个FragmentTransaction对象,通过调用 beginTransaction()方法开启。也可用于管理Fragment的添加、移除等操作。

  3. 使用FragmentTransaction的方法(如add()replace()等)来添加或替换Fragment。

  4. 提交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中根据设备的不同配置来动态调整其行为或布局来实现的

  1. 根据条件加载不同的布局。在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);  
}
  1. 通过Fragment参数或宿主Activity传递配置信息:
    如果Fragment需要根据特定的配置来显示不同的内容或行为,你可以通过向Fragment传递参数(如通过Bundle在创建Fragment时)或让宿主Activity将配置信息传递给Fragment(例如,通过接口回调)。

ListView

(思考LayoutInflater使用Inflate()方法,内部类 ViewHolder,用于对控件的实例进行缓存)

ListView 是 Android 中用于显示列表项的一个组件,它继承自 AbsListView。ListView 允许你展示一个可滚动的列表项集合,每个列表项都可以是自定义的视图。

具体实现步骤:

  1. 接着定义一个实体类,作为 ListView适配器的适配类型。新建类Goods(bean)

  2. 设定好布局文件

  3. 创建自定义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;
    
  1. 创建一个ListView,Fruit实类的ArrayList数组存储,加载适配器到ListView。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    附加:

    1. 调用 inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的 id,,第二个参数是给加载好的布局再添加一个父布局。

    2. getView()方法中还有一个convertView 参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。

    3. 新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。

    • 调用 View的 setTag()方法,将ViewHolder对象存储在 View中

    • 当convertView不为 null 的时候则调用 View 的 getTag()方法,把 ViewHolder 重新取出。

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    1. ListView的点击监听事件

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RecyclerView 是 Android L(API 级别 21)引入的一个更灵活、更强大的列表组件,用于展示大量数据集。它不仅可以实现垂直滚动列表,还可以实现水平滚动列表、网格布局等

具体实现步骤:

  1. 接着定义一个实体类,作为 RecyclerView适配器的适配类型。新建类Goods(bean)

  2. 设定好布局文件

  3. 创建自定义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();
        }
    
  1. 在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);
    

    附加:

    1. 横向滚动:调用 LinearLayoutManager的setOrientation()方法来设置布局的排列方向,默认是纵向排列的,我们传人 LinearLayoutManager.HORIZONTAL 表示让布局横行排列,这样RecyclerView就可以横向滚动了。

    2. 瀑布流:首先,在onCreate()方法中,我们创建了一个StaggeredGridLayoutManager 的实例。StaggeredGridLayoutManager 的构造函数接收两个参数,第一个参数用于指定布局的列数传入3表示会把布局分为3列;第二个参数用于指定布局的排列方向,传入StaggeredGrid-LayoutManager.VERTICAL 表示会让布局纵向排列,最后再把创建好的实例设置到 RecyclerView当中就可以了。

    StaggeredGridLayoutManager layoutManager=new
    StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
    
    1. 点击事件:可使用ViewHolder中的实列,实现点击子项中的布局的点击事件。

项目相关案例

流程图

从数据库中提取商品相关数据并显示在Activity中的列表中。

创建商品实类Goods
创建Goodsitem布局文件
创建适配器GoodsAdapter
将GoodsAdapter适配器加载到GoodsFragment
GoodsFragment嵌入到MainActivity中

相关代码:

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();
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值