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

一.搜索界面的设计与实现

  1.搜索界面的布局设计

 

   2.结果界面的布局设计

 

  3.搜索界面的功能设计

 

二.布局代码部分

  1.fragment_one.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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/input_kc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入菜谱类型"
            android:layout_weight="1"
            android:gravity="center"/>
        <Button
            android:id="@+id/btn_search"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:background="@drawable/search_bar_icon_normal"/>
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy_view_parent"
        android:layout_width="match_parent"
        android:layout_height="50dp"></android.support.v7.widget.RecyclerView>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy_view1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>

</LinearLayout>

  2.recy_cx_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">

    <ImageView
        android:id="@+id/cx_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/cx_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="名称"
            android:textSize="20sp"
            android:textColor="#000000"
            />
        <TextView
            android:id="@+id/cx_des"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="介绍"/>
    </LinearLayout>

</LinearLayout>

  3.recy_cx_result.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:id="@+id/txt_result"
        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_view3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

三.代码部分

  1.OneFragment.java

添加按钮单击事件

package com.example.cookbook;

import android.content.Intent;
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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.jetbrains.annotations.NotNull;

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

import okhttp3.Call;
import okhttp3.Response;

public class OneFragment extends Fragment {
    //定义RecyclerView控件
    private RecyclerView recy_view1;  //菜谱列表
    private RecyclerView recy_view_tags;  //菜谱类别
    //定义EditText控件对象、Button控件对象
    private EditText input_kc;  //定义搜索框对象
    private Button btn_search; //定义搜索按钮对象

    //进入菜谱主界面时,默认选中第一种类型
    private String currentTag = TagAdapter.DEFAULT_TAGS[0];

    //定义食谱数组
    private List<JsonToBean.ShowapiResBodyBean.DatasBean> recipeList = new ArrayList<>();

    private  void initData()
    {
        //定义当前类型菜谱的访问地址
        String address = String.format("http://route.showapi.com/1164-1?showapi_appid=160511&type=%s&showapi_sign=943d4b06fbf44191bba7a37d15fa3152", currentTag);

        HttpUtil.sendOkHttpRequest(address,new okhttp3.Callback(){

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String jsonStr = response.body().string();
                JsonToBean jsonToBean = new Gson().fromJson(jsonStr,new TypeToken<JsonToBean>(){}.getType());
                JsonToBean.ShowapiResBodyBean showapiResBodyBean = jsonToBean.getShowapi_res_body();
                List<JsonToBean.ShowapiResBodyBean.DatasBean> datasBeans = showapiResBodyBean.getDatas();
                if(getActivity()==null)
                    return;
                recipeList.clear();
                recipeList.addAll(datasBeans);
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //创建RecipeAdapter类的实例,并作为垂直RecyclerView控件的适配器
                        RecipeAdapter adapter = new RecipeAdapter(getActivity(), recipeList);
                        //布局管理器让数据显示到recyclerview控件里面
                        StaggeredGridLayoutManager st = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
                        recy_view1.setLayoutManager(st);
                        recy_view1.setAdapter(adapter);
                    }
                });
            }

            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                if(getActivity()==null) return;
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity(),"网络错误",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one,container,false);
        initView(view);  //控件的绑定
        return  view;
    }

    private  void initView(View view)
    {
        recy_view1 = view.findViewById(R.id.recy_view1);
        recy_view_tags = view.findViewById(R.id.recy_view_parent);
        //创建TagAdapter类的实例
        //创建TagAdapter的实例,并作为水平RecyclerView控件的适配器
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recy_view_tags.setLayoutManager(layoutManager);
        recy_view_tags.setAdapter(new TagAdapter(this));
        input_kc = view.findViewById(R.id.input_kc);
        btn_search = view.findViewById(R.id.btn_search);
        //给“搜索”按钮设置点击事件
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(),MenuSearchActivity.class);
                String input_name = input_kc.getText().toString();
                intent.putExtra("search",input_name);
                getActivity().startActivity(intent);
            }
        });
    }

    public void notifyOnTagClick(String tag) {
        currentTag = tag;
        initData();   //重新获取服务器的菜谱数据
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
    }
}

  2.MenuSearchActivity.java

package com.example.cookbook;

import android.os.Bundle;
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.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.jetbrains.annotations.NotNull;

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

import okhttp3.Call;
import okhttp3.Response;

public class MenuSearchActivity extends AppCompatActivity {
    //定义JAVA对象
    private TextView txt_result;  //搜索结果布局中的提示信息控件
    private RecyclerView recy_view3;  //搜索结果布局中的列表控件

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recy_cx_result);  //加载搜索结果对应的布局文件
        initView();   //完成控件的绑定
        loadData();   //完成服务器数据的抓取,并显示到RecyclerView控件上
     }

    private void loadData() {
        //接收从前面搜索框传递过来的搜索条件
        String ke_name = getIntent().getStringExtra("search");
        //重新拼接成新的目标网络访问地址
        String address = String.format("http://route.showapi.com/1164-1?showapi_appid=160511&type=%s&showapi_sign=943d4b06fbf44191bba7a37d15fa3152", ke_name);
        //调用HttpUtil工具类发起HTTP请求
        HttpUtil.sendOkHttpRequest(address,new okhttp3.Callback(){

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String jsonStr = response.body().string();
                JsonToBean jsonToBean = new Gson().fromJson(jsonStr, new TypeToken<JsonToBean>() {
                }.getType());
                JsonToBean.ShowapiResBodyBean showapiResBodyBean = jsonToBean.getShowapi_res_body();
                final List<JsonToBean.ShowapiResBodyBean.DatasBean> datasBeans = showapiResBodyBean.getDatas();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        final List<JsonToBean.ShowapiResBodyBean.DatasBean> arrlist5 = datasBeans;
                        txt_result.setText("您好,共查询到" + arrlist5.size() + "条数据,分别如下:");
                        RecipeSearchAdapter adapter = new RecipeSearchAdapter(MenuSearchActivity.this, arrlist5);
                        StaggeredGridLayoutManager st = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
                        recy_view3.setLayoutManager(st);
                        recy_view3.setAdapter(adapter);
                    }
                });
            }

            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        txt_result.setText("未查询到相关菜谱!");
                    }
                });
            }
        });
    }

    public  void initView(){
        txt_result = findViewById(R.id.txt_result);
        recy_view3 = findViewById(R.id.recy_view3);
     }
}

  3.RecipeSearchAdapter.java

package com.example.cookbook;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.List;

public class RecipeSearchAdapter extends RecyclerView.Adapter<RecipeSearchAdapter.ViewHolder> {
    private Context wcontext;
    private List<JsonToBean.ShowapiResBodyBean.DatasBean> arrlist6;
    //创建构造方法
    public RecipeSearchAdapter(Context wcontext, List<JsonToBean.ShowapiResBodyBean.DatasBean> arrlist6) {
        this.wcontext = wcontext;
        this.arrlist6 = arrlist6;
    }
    @Override
    public RecipeSearchAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        View view= LayoutInflater.from(wcontext).inflate(R.layout.recy_cx_item,parent,false);
        ViewHolder myholder=new ViewHolder(view);
        return myholder;
    }
    @Override
    public void onBindViewHolder(RecipeSearchAdapter.ViewHolder myholder, int i) {
        final JsonToBean.ShowapiResBodyBean.DatasBean courseInfo= arrlist6.get(i);
        myholder.cx_name.setText(courseInfo.getCpName());
        myholder.cx_des.setText(courseInfo.getDes());
        Glide.with(wcontext).load(courseInfo.getSmallImg()).into(myholder.cx_img);
        myholder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(wcontext, RecipeDetailActivity.class);
                intent.putExtra("data",courseInfo);
                wcontext.startActivity(intent);
            }
        });
    }
    @Override
    public int getItemCount() {
        return arrlist6.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView cx_img;
        TextView cx_name,cx_des;
        public ViewHolder(View itemView) {
            super(itemView);
            cx_img=itemView.findViewById(R.id.cx_img);
            cx_name=itemView.findViewById(R.id.cx_name);
            cx_des=itemView.findViewById(R.id.cx_des);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/indeedes/article/details/121525243
今日推荐