私厨菜谱app的设计与实现(四)

一.菜谱收藏界面的设计与实现

  1.项目简介

  2.“收藏”/”取消收藏”按钮布局设计

   3.1、数据库的设计

  3.2、数据库的操作

  4.收藏界面的布局设计

二.界面代码部分

  1.recipe_detail.xml

加入一个Button控件即可。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="20dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="5dp"
        android:layout_gravity="center">
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/dot"
            android:layout_gravity="center"/>
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="食材用料:"
            android:textColor="#0000ff"
            android:textSize="28sp"
            android:textStyle="bold"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button_favorite"
            android:text="收藏"/>
    </LinearLayout>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy_view_yl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_gravity="center"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:background="@color/colorAccent"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="5dp"
        android:layout_gravity="center">
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/dot"
            android:layout_gravity="center"/>
        <TextView
            android:id="@+id/text_zuofa"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="做法步骤:"
            android:textColor="#0000ff"
            android:textSize="28sp"
            android:textStyle="bold"/>
    </LinearLayout>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy_view_step"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_gravity="center"/>

</LinearLayout>

  2.fragment_two.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="您好,您收藏的菜谱信息如下:"
        android:textSize="25sp"
        android:textColor="#ff0000"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy_view2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

  3.recy_sc_item.xml

<?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">

    <TextView
        android:id="@+id/sc_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="11"
        android:textSize="50sp"
        android:textColor="#000000"/>
    <ImageView
        android:id="@+id/sc_img"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@mipmap/ic_launcher"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center">
        <TextView
            android:id="@+id/sc_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="20sp"
            android:textColor="#000000"
            />
        <TextView
            android:id="@+id/sc_des"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""/>
    </LinearLayout>

</LinearLayout>

三.代码部分

  1.MyDBHelper.java

package com.example.cookbook;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {

    //定义数据库的名称和数据库的版本号
    private static final String DBNAME = "zscourse1.db";
    private static final int VERSION = 1;
    //创建类的构造方法
    public  MyDBHelper(Context context){
        super(context,DBNAME,null,VERSION);
    }

    //重写onCreate()方法

    @Override
    //执行建表的操作
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table tb_recipe(" +
                "id integer primary key autoincrement," +
                "recipeId varchar(50)," +
                "recipeName varchar(20)," +
                "recipeDesc varchar(20)," +
                "recipeSmallImgUrl varchar(100));");
    }

    //重写onUpgrade()方法

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

  2.RecipeDetailActivity.java

package com.example.cookbook;

import android.database.Cursor;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

public class RecipeDetailActivity extends AppCompatActivity {
    RecyclerView recyclerView_yl;  //"食材用料"列表
    RecyclerView recyclerView_step;   //"做法步骤"列表
    JsonToBean.ShowapiResBodyBean.DatasBean  bean;  //存放上一个界面传递过来的数据
    Button button_favorite;  //“收藏”按钮
    boolean isFavorite = false; //代表该条数据是否已收藏
    MyDBHelper dbHelper;  //SQLite数据库帮助类的对象

    private void initView(){
        recyclerView_yl = findViewById(R.id.recy_view_yl);
        recyclerView_step = findViewById(R.id.recy_view_step);
        bean = (JsonToBean.ShowapiResBodyBean.DatasBean) getIntent().getSerializableExtra("data");
        dbHelper = new MyDBHelper(this);    //创建MyDBHelper类的对象
        button_favorite = findViewById(R.id.button_favorite);
        button_favorite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(isFavorite){
                    dbHelper.getWritableDatabase().execSQL("DELETE FROM tb_recipe WHERE recipeId=?",new Object[]{bean.getId()});
                }else{
                    dbHelper.getWritableDatabase().execSQL("INSERT INTO tb_recipe(recipeId,recipeName,recipeDesc,recipeSmallImgUrl) VALUES (?,?,?,?)",new Object[]{bean.getId(),bean.getCpName(),bean.getDes(),bean.getSmallImg()});
                }
                isFavorite = !isFavorite;
                button_favorite.setText(isFavorite?"取消收藏":"收藏");
            }
        });
    }

    //将数据动态更新到UI界面上
    private  void loadData(){
        List<JsonToBean.ShowapiResBodyBean.DatasBean.YlBean> arrlistyl = new ArrayList<>(bean.getYl());
        List<JsonToBean.ShowapiResBodyBean.DatasBean.StepsBean> arrliststep = new ArrayList<>(bean.getSteps());
        YlAdapter adapteryl = new YlAdapter(this, arrlistyl);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        recyclerView_yl.setLayoutManager(layoutManager);
        recyclerView_yl.setAdapter(adapteryl);
        StepAdapter adapterstep = new StepAdapter(this, arrliststep);
        StaggeredGridLayoutManager layoutManager1 = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
        recyclerView_step.setLayoutManager(layoutManager1);
        recyclerView_step.setAdapter(adapterstep);
        //判断当前菜谱是否已收藏
        Cursor cursor = dbHelper.getReadableDatabase().rawQuery("SELECT id FROM tb_recipe WHERE recipeId=?",new String[]{bean.getId()});
        isFavorite = cursor.getCount()>0;
        button_favorite.setText(isFavorite?"取消收藏":"收藏");
        cursor.close();
    }

    //重写onCreate()方法

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recipe_detail);
        initView();
        loadData();
    }
}

  3.CourseSCAdapter.java

package com.example.cookbook;

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class CourseSCAdapter extends RecyclerView.Adapter<CourseSCAdapter.ViewHolder> {
    private Context ncontext;
    private List<JsonToBean.ShowapiResBodyBean.DatasBean> arrlist4;
    public CourseSCAdapter(Context ncontext, List<JsonToBean.ShowapiResBodyBean.DatasBean> arrlist4) {
        this.ncontext = ncontext;
        this.arrlist4 = arrlist4;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        View view= LayoutInflater.from(ncontext).inflate(R.layout.recy_sc_item,parent,false);
        ViewHolder nholder=new ViewHolder(view);
        return nholder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        final JsonToBean.ShowapiResBodyBean.DatasBean courseInfo=arrlist4.get(i);
        viewHolder.sc_id.setText(i+1+"");
        Glide.with(ncontext).load(courseInfo.getSmallImg()).into(viewHolder.sc_img);
        viewHolder.sc_name.setText(courseInfo.getCpName());
        viewHolder.sc_des.setText(courseInfo.getDes());
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //数据库里只存储了部分数据,需要使用时查询完整的数据
                String address = String.format("http://route.showapi.com/1164-1?showapi_appid=160511&type=%s&id=%s&showapi_sign=943d4b06fbf44191bba7a37d15fa3152", courseInfo.getType_v2(),courseInfo.getId());
                HttpUtil.sendOkHttpRequest(address,new Callback(){

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String jsonStr = response.body().string();
                        JsonToBean javaToBean = new Gson().fromJson(jsonStr,new TypeToken<JsonToBean>(){}.getType());
                        JsonToBean.ShowapiResBodyBean showapiResBodyBean = javaToBean.getShowapi_res_body();
                        List<JsonToBean.ShowapiResBodyBean.DatasBean> datasBeans = showapiResBodyBean.getDatas();
                        Log.d("+++++++++++++++++",datasBeans.size()+"");
                        //跳转页面的代码
                        Intent intent=new Intent(ncontext, RecipeDetailActivity.class);
                        intent.putExtra("data",datasBeans.get(0));
                        ncontext.startActivity(intent);
                    }

                    @Override
                    public void onFailure( Call call, IOException e) {
                        new Handler().post(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(ncontext, "数据查询失败", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });
            }
        });
    }

    @Override
    public int getItemCount() {
        return arrlist4.size();
    }
    //创建内部类ViewHolder
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView sc_id;
        ImageView sc_img;
        TextView sc_name;
        TextView sc_des;
        public ViewHolder(View itemView) {
            super(itemView);
            sc_id=itemView.findViewById(R.id.sc_id);
            sc_img=itemView.findViewById(R.id.sc_img);
            sc_name=itemView.findViewById(R.id.sc_name);
            sc_des=itemView.findViewById(R.id.sc_des);
        }
    }
}

  4.TwoFragment.java

package com.example.cookbook;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class TwoFragment extends Fragment {
    //定义JAVA对象
    private RecyclerView recy_view2;
    private MyDBHelper mhelper;  //数据库帮助类的对象,完成数据库、数据表的创建等
    private SQLiteDatabase db;  //数据库操作对象
    ArrayList<JsonToBean.ShowapiResBodyBean.DatasBean>  arrlist3;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_two,container,false);
        initView(view);
        return view;
    }

    private void initView(View view){
        //完成控件的绑定
        recy_view2 = view.findViewById(R.id.recy_view2);
        mhelper = new MyDBHelper(getActivity());
        db = mhelper.getWritableDatabase();
    }

    //重写onActivityCreated()方法,当用户进入收藏界面后,就会去执行该方法

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();    //数据的初始化
    }

    private void initData(){
        //获取数据
        arrlist3 = new ArrayList<JsonToBean.ShowapiResBodyBean.DatasBean>();
        Cursor cursor = db.rawQuery("select * from tb_recipe", null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("recipeName"));
            String resId = cursor.getString(cursor.getColumnIndex("recipeId"));
            String desc = cursor.getString(cursor.getColumnIndex("recipeDesc"));
            String smallImg = cursor.getString(cursor.getColumnIndex("recipeSmallImgUrl"));
            JsonToBean.ShowapiResBodyBean.DatasBean bean = new JsonToBean.ShowapiResBodyBean.DatasBean();
            bean.setCpName(name);
            bean.setId(resId);
            bean.setDes(desc);
            bean.setSmallImg(smallImg);
            arrlist3.add(bean);
        }
        cursor.close();
        //创建自定义适配器的对象
        CourseSCAdapter adapter = new CourseSCAdapter(getActivity(), arrlist3);
        //用网格布局管理器将数据显示出来
        StaggeredGridLayoutManager st = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
        recy_view2.setLayoutManager(st);
        recy_view2.setAdapter(adapter);
    }

    @Override
    public void onResume() {
        super.onResume();
        arrlist3.clear();
        initData();
    }
}

猜你喜欢

转载自blog.csdn.net/indeedes/article/details/121503352