一.菜谱收藏界面的设计与实现
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();
}
}