如何在不始终显示recyclerview的情况下使用searchview? [英] How to use a searchview without the recyclerview being showed all the time?

查看:63
本文介绍了如何在不始终显示recyclerview的情况下使用searchview?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动,其中包含一些与此无关的按钮,顶部还有一个RelativeLayout内部的searchview.我想要的是,当我在searchview上书写时,recyclerview数组会出现在屏幕上,但是当我什么都没写的时候,只会出现我之前告诉过的按钮.

为了避免在不使用searchview时显示recyclerView,我所做的就是在宽度和高度参数中设置0dp.

那是我的MainActivity.java:

 公共类Dishes扩展了AppCompatActivity实现Adaptador2.OnRecipeListener {按钮boton_verdura;按钮boton_carne;按钮boton_pasta;按钮boton_sopas;按钮boton_pescados;按钮boton_ensaladas;私人RecyclerView recyclerView;@Override受保护的void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_dishes);this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);boton_verdura = [按钮)findViewById(R.id.boton_verduras);boton_carne =(按钮)findViewById(R.id.boton_carnes);boton_pasta =(按钮)findViewById(R.id.boton_pasta);boton_sopas =(按钮)findViewById(R.id.boton_sopas);boton_pescados =(按钮)findViewById(R.id.boton_pescados);boton_ensaladas = [按钮)findViewById(R.id.boton_ensaladas);boton_verdura.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Verduras.class);startActivity(in);}});boton_carne.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Carnes.class);startActivity(in);}});boton_pasta.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Pasta.class);startActivity(in);}});boton_sopas.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Sopas.class);startActivity(in);}});boton_pescados.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Pescados.class);startActivity(in);}});boton_ensaladas.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent in = new Intent(Dishes.this,Ensaladas.class);startActivity(in);}});recyclerView = findViewById(R.id.lv_prueba);LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(layoutManager);列表< Entidad2>listItems = new ArrayList<>();listItems.add(new Entidad2(R.drawable.calabacines_3,"Calabacines","10分钟",4,R.drawable.color_ensaladas));listItems.add(new Entidad2(R.drawable.patatas_deluxe_especiadas_70523_300_150,"Patatas","15分钟",2,R.drawable.color_ensaladas));listItems.add(new Entidad2(R.drawable.tomate,"Tomates","2分钟",5,R.drawable.color_ensaladas));;Adaptador2 Adaptador2 =新的Adaptador2(listItems,this);recyclerView.setAdapter(Adaptador2);Adaptador2.notifyDataSetChanged();}@Overridepublic void OnRecipe(int position){if(position == 0){Intent in = new Intent(this,Judias_verdes.class);startActivity(in);}if(position == 1){Intent in = new Intent(this,Sardinas_fritas.class);startActivity(in);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.example_menu,菜单);MenuItem searchItem = menu.findItem(R.id.action_search);SearchView searchView =(SearchView)searchItem.getActionView();searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){@Overridepublic boolean onQueryTextSubmit(String query){返回false;}@Overridepublic boolean onQueryTextChange(String newText){Adaptador2.getFilter().filter(newText);返回false;}});返回true;}} 

这是我的Mainactivity.xml

 <?xml version ="1.0" encoding ="utf-8"?>< RelativeLayout xmlns:android ="http://schemas.android.com/apk/res/android"xmlns:app ="http://schemas.android.com/apk/res-auto"xmlns:tools ="http://schemas.android.com/tools"android:layout_width ="match_parent"android:layout_height ="match_parent"android:background =#ffff00"tools:context =.Dishes">< LinearLayoutandroid:layout_width ="match_parent"android:layout_height ="match_parent"android:orientation ="vertical">< RelativeLayoutandroid:layout_width ="match_parent"android:layout_height ="84dp">< android.support.v7.widget.SearchViewandroid:id ="@ + id/rv_buscar"android:layout_width ="match_parent"android:layout_height ="wrap_content"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:background ="@ drawable/line"android:layout_centerVertical ="true"android:gravity ="center_vertical"></android.support.v7.widget.SearchView></RelativeLayout>< ScrollViewandroid:layout_width ="match_parent"android:layout_height ="wrap_content">< LinearLayoutandroid:layout_width ="match_parent"android:layout_height ="wrap_content"android:orientation ="vertical"><按钮android:id ="@ + id/boton_sopas"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_sopa_15"android:drawableStart ="@ drawable/logo_sopa_15"android:text ="Sopas"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"app:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="HardcodedText,MissingConstraints"/><按钮android:id ="@ + id/boton_pescados"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:layout_marginTop ="24dp"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_pescado3_30_15"android:drawableStart ="@ drawable/logo_pescado3_30_15"android:text ="Pescados"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"app:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="HardcodedText,MissingConstraints"/><按钮android:id ="@ + id/boton_ensaladas"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:layout_marginTop ="24dp"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_ensalada3_30_15"android:drawableStart ="@ drawable/logo_ensalada3_30_15"android:text ="Ensaladas"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"app:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="HardcodedText,MissingConstraints"/><按钮android:id ="@ + id/boton_carnes"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:layout_marginTop ="24dp"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_filete_30_15"android:drawableStart ="@ drawable/logo_filete_30_15"android:text ="Carnes"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"app:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="DuplicateIds,HardcodedText,MissingConstraints"/><按钮android:id ="@ + id/boton_verduras"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:layout_marginTop ="24dp"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_vegetables_30_15"android:drawableStart ="@ drawable/logo_vegetables_30_15"android:text ="Verduras"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"app:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="HardcodedText,MissingConstraints"/><按钮android:id ="@ + id/boton_pasta"android:layout_width ="match_parent"android:layout_height ="80dp"android:layout_marginBottom ="15dp"android:layout_marginLeft ="35dp"android:layout_marginRight ="35dp"android:layout_weight ="1"android:layout_marginTop ="24dp"android:background ="@ drawable/boton_redondo"android:drawableLeft ="@ drawable/logo_pizza_30_15"android:drawableStart ="@ drawable/logo_pizza_30_15"android:text =意大利面"android:textAllCaps ="false"android:textSize ="40sp"android:textStyle ="normal"android:textAlignment ="textStart"android:layout_gravity ="start"android:fontFamily ="@ font/san_francisco_display_regular"工具:ignore ="HardcodedText,MissingConstraints"/></LinearLayout></ScrollView>< android.support.v7.widget.RecyclerViewandroid:id ="@ + id/lv_prueba"android:layout_width ="0dp"android:layout_height ="0dp"></android.support.v7.widget.RecyclerView></LinearLayout></RelativeLayout> 

那就是Adaptor.java:

  ackage com.test.platos_4;导入android.support.v7.widget.RecyclerView;导入android.view.LayoutInflater;导入android.view.View;导入android.view.ViewGroup;导入android.widget.Filter;导入android.widget.Filterable;导入android.widget.ImageView;导入android.widget.RatingBar;导入android.widget.TextView;导入java.util.ArrayList;导入java.util.List;公共类Adaptador2扩展了RecyclerView.Adapter< Adaptador2.ViewHolder>实现可过滤{私有列表< Entidad2>listItems;私有列表< Entidad2>listItemsFull;私人OnRecipeListener mOnRecipeListener;公共Adaptador2(List< Entidad2> listItems,OnRecipeListener onRecipeListener){this.listItems = listItems;listItemsFull =新的ArrayList<>(listItems);this.mOnRecipeListener = onRecipeListener;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){视图view = LayoutInflater.from(parent.getContext()).inflate(R.layout.elemento_lista2,parent,false);返回新的ViewHolder(view,mOnRecipeListener);}@Overridepublic void onBindViewHolder(ViewHolder viewholder,int position){资源int = listItems.get(position).getImgFoto();字符串标题= listItems.get(position).getTitulo();字符串时间= listItems.get(position).getTiempo();int巴拉= listItems.get(position).getRating();最终的int优先级= listItems.get(position).getPriority();//int fondo = listItems.get(position).getColorfondo();viewholder.setData(资源,标题,时间,巴拉);//您可以像这样将点击的项目的优先级传递回您的活动viewholder.itemView.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){mOnRecipeListener.OnRecipe(priority);}});//通过func视线获取viewholder.setData(resource,title,time,barra,fondo);}@Overridepublic int getItemCount(){return listItems.size();}@Override公共过滤器getFilter(){返回exampleFilter;}私人过滤器exampleFilter = new Filter(){@Override受保护的FilterResults performFiltering(CharSequence约束){列表< Entidad2>filteredList = new ArrayList<>();if(constraint == null || Constraint.length()== 0){filteredList.addAll(listItemsFull);}别的 {字符串filterPattern =约束.toString().toLowerCase().trim();for(Entidad2 item:listItemsFull){如果(item.getTitulo().toLowerCase().contains(filterPattern)){filteredList.add(item);}}}FilterResults结果=新的FilterResults();results.values = filteredList;返回结果;}@Override受保护的无效publishResults(CharSequence约束,FilterResults结果){listItems.clear();listItems.addAll((List)results.values);notifyDataSetChanged();}};ViewHolder类扩展了RecyclerView.ViewHolder实现了View.OnClickListener {私人ImageView imgFoto;私人TextView titulo;私有的TextView tiempo;私人RatingBar ratingBar;//私有ImageView colorfondo;OnRecipeListener onRecipeListener;公共ViewHolder(查看itemView,OnRecipeListener onRecipeListener){超级(itemView);imgFoto = itemView.findViewById(R.id.imgFoto);titulo = itemView.findViewById(R.id.tvTitulo);tiempo = itemView.findViewById(R.id.tvTiempo);ratingBar = itemView.findViewById(R.id.ratingBarVerd);//colorfondo = itemView.findViewById(R.id.colorfondo);//this.onRecipeListener = onRecipeListener;}////否定私有颜色setData(int resource,String title,String time,int barra,int fondo){private void setData(int resource,字符串标题,字符串时间,int巴拉){imgFoto.setImageResource(resource);titulo.setText(title);tiempo.setText(time);ratingBar.setRating(barra);//colorfondo.setImageResource(fondo);}@Overridepublic void onClick(View v){}}公共接口OnRecipeListener {void OnRecipe(int priority);}} 

但是出现错误:

请帮助我不确定该怎么做,因为我从未使用过SearchView,所以任何帮助都将是有用的.

谢谢

在运行应用程序时尝试进入活动时出现的新问题:

 <代码> 08-14 16:33:07.115 17470-17470/com.test.platos_4 E/Android运行时:致命异常:主要流程:com.test.platos_4,PID:17470java.lang.ClassCastException:android.support.v7.widget.SearchView无法转换为android.widget.SearchView在com.test.platos_4.Dishes.onCreateOptionsMenu(Dishes.java:136)在android.app.Activity.onCreatePanelMenu(Activity.java:3546)在android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:328)在android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:93)在android.support.v7.app.AppCompatDelegateImplBase $ AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:332)在android.support.v7.app.AppCompatDelegateImplV9.preparePanel(AppCompatDelegateImplV9.java:1370)在android.support.v7.app.AppCompatDelegateImplV9.doInvalidatePanelMenu(AppCompatDelegateImplV9.java:1650)在android.support.v7.app.AppCompatDelegateImplV9 $ 1.run(AppCompatDelegateImplV9.java:134)在android.os.Handler.handleCallback(Handler.java:873)在android.os.Handler.dispatchMessage(Handler.java:99)在android.os.Looper.loop(Looper.java:201)在android.app.ActivityThread.main(ActivityThread.java:6815)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:547)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)08-14 16:33:07.119 17470-17470/com.test.platos_4 E/MQSEventManagerDelegate:无法获取MQSService. 

解决方案

您看到的 getFilter()错误是因为您试图在Adaptador2上调用 getFilter(),但由于 getFilter()不是静态方法,因此您需要在适配器的实例上调用它,而不是在诸如 someInstanceOfAdapterClass.getFilter() 之类的适配器类上调用它>

一个主要问题是,用与该类相同的名称来命名Adaptador类实例,这是一个非常糟糕的主意...在以下几行中:

  Adaptador2 Adaptador2 =新的Adaptador2(listItems,this);//这不好recyclerView.setAdapter(Adaptador2);Adaptador2.notifyDataSetChanged(); 

您想将变量重命名为与类名不同的名称,通常要做的是使用小写字母.您还需要在活动变量中对其进行跟踪,以便可以在onCreateOptionsMenu中对其进行访问,因此请执行以下操作:

主要活动顶部的

 //定义它私人Adaptador2 Adaptador2; 

 //创建它的实例Adaptador2 =新的Adaptador2(listItems,this);recyclerView.setAdapter(adaptador2);Adaptador2.notifyDataSetChanged(); 

onCreateOptionsMenu中的

 //使用小写字母1引用对象实例//班上Adaptador2.getFilter().filter(newText); 


(我还没有测试过,但是可能有用)

对于隐藏回收者视图,您可以在onQueryChanged方法中执行以下操作:

  @Overridepublic boolean onQueryTextChange(String newText){//只要搜索查询为空,这就会隐藏您的回收站//并在有搜索查询时显示如果(newText =="){recyclerView.setVisibilty(View.GONE);} 别的 {recyclerView.setVisibilty(View.VISIBLE);}Adaptador2.getFilter().filter(newText);返回false;} 

I've an activity with some buttons that don't have anything to do with that, and also a searchview inside a RelativeLayout on the top. What I want is that when I write on the searchview, the recyclerview arrays appear on the screen, but that when i'm not writing anything appears, just the buttons i told you before.

What i did to avoid the recyclerView to be shown when the searchview is not being used is to set 0dp in it's width and height parameters.

That is my MainActivity.java:

public class Dishes extends AppCompatActivity implements Adaptador2.OnRecipeListener {
    Button boton_verdura;
    Button boton_carne;
    Button boton_pasta;
    Button boton_sopas;
    Button boton_pescados;
    Button boton_ensaladas;
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dishes);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        boton_verdura=(Button) findViewById(R.id.boton_verduras);
        boton_carne=(Button) findViewById(R.id.boton_carnes);
        boton_pasta=(Button) findViewById(R.id.boton_pasta);
        boton_sopas=(Button) findViewById(R.id.boton_sopas);
        boton_pescados=(Button) findViewById(R.id.boton_pescados);
        boton_ensaladas=(Button) findViewById(R.id.boton_ensaladas);

        boton_verdura.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Verduras.class);
                startActivity(in);
            }
        });

        boton_carne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Carnes.class);
                startActivity(in);
            }
        });

        boton_pasta.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Pasta.class);
                startActivity(in);
            }
        });

        boton_sopas.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Sopas.class);
                startActivity(in);
            }
        });

        boton_pescados.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Pescados.class);
                startActivity(in);
            }
        });

        boton_ensaladas.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(Dishes.this,Ensaladas.class);
                startActivity(in);
            }
        });


        recyclerView = findViewById(R.id.lv_prueba);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(layoutManager);

        List<Entidad2> listItems = new ArrayList<>();
        listItems.add(new Entidad2(R.drawable.calabacines_3, "Calabacines", " 10 min.", 4, R.drawable.color_ensaladas));
        listItems.add(new Entidad2(R.drawable.patatas_deluxe_especiadas_70523_300_150, "Patatas", " 15 min.", 2, R.drawable.color_ensaladas));
        listItems.add(new Entidad2(R.drawable.tomate, "Tomates", " 2 min.", 5, R.drawable.color_ensaladas));

        Adaptador2 Adaptador2 = new Adaptador2(listItems, this);
        recyclerView.setAdapter(Adaptador2);
        Adaptador2.notifyDataSetChanged();
    }

    @Override
    public void OnRecipe(int position) {

        if(position == 0){
            Intent in = new Intent(this, Judias_verdes.class);
            startActivity(in);
        }
        if(position == 1){
            Intent in = new Intent(this, Sardinas_fritas.class);
            startActivity(in);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.example_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                Adaptador2.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }
}

And this is my Mainactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff00"
    tools:context=".Dishes">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="84dp">

            <android.support.v7.widget.SearchView
                android:id="@+id/rv_buscar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:background="@drawable/line"
                android:layout_centerVertical="true"
                android:gravity="center_vertical">

            </android.support.v7.widget.SearchView>

        </RelativeLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/boton_sopas"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_sopa_15"
                android:drawableStart="@drawable/logo_sopa_15"
                android:text="   Sopas"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                app:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="HardcodedText,MissingConstraints"/>

            <Button
                android:id="@+id/boton_pescados"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:layout_marginTop="24dp"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_pescado3_30_15"
                android:drawableStart="@drawable/logo_pescado3_30_15"
                android:text="   Pescados"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                app:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="HardcodedText,MissingConstraints" />

            <Button
                android:id="@+id/boton_ensaladas"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:layout_marginTop="24dp"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_ensalada3_30_15"
                android:drawableStart="@drawable/logo_ensalada3_30_15"
                android:text="   Ensaladas"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                app:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="HardcodedText,MissingConstraints" />

            <Button
                android:id="@+id/boton_carnes"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:layout_marginTop="24dp"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_filete_30_15"
                android:drawableStart="@drawable/logo_filete_30_15"
                android:text="   Carnes"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                app:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="DuplicateIds,HardcodedText,MissingConstraints" />

            <Button
                android:id="@+id/boton_verduras"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:layout_marginTop="24dp"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_vegetables_30_15"
                android:drawableStart="@drawable/logo_vegetables_30_15"
                android:text="   Verduras"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                app:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="HardcodedText,MissingConstraints" />

            <Button
                android:id="@+id/boton_pasta"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginBottom="15dp"
                android:layout_marginLeft="35dp"
                android:layout_marginRight="35dp"
                android:layout_weight="1"
                android:layout_marginTop="24dp"
                android:background="@drawable/boton_redondo"
                android:drawableLeft="@drawable/logo_pizza_30_15"
                android:drawableStart="@drawable/logo_pizza_30_15"
                android:text="   Pasta"
                android:textAllCaps="false"
                android:textSize="40sp"
                android:textStyle="normal"
                android:textAlignment="textStart"
                android:layout_gravity="start"
                android:fontFamily="@font/san_francisco_display_regular"
                tools:ignore="HardcodedText,MissingConstraints" />

        </LinearLayout>
    </ScrollView>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/lv_prueba"
            android:layout_width="0dp"
            android:layout_height="0dp">
        </android.support.v7.widget.RecyclerView>

    </LinearLayout>
</RelativeLayout>

And that is the Adaptor.java:

ackage com.test.platos_4;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

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

public class Adaptador2  extends RecyclerView.Adapter<Adaptador2.ViewHolder> implements Filterable
{
    private List<Entidad2> listItems;
    private List<Entidad2> listItemsFull;
    private OnRecipeListener mOnRecipeListener;

    public  Adaptador2(List<Entidad2> listItems, OnRecipeListener onRecipeListener) {
        this.listItems = listItems;
        listItemsFull = new ArrayList<>(listItems);
        this.mOnRecipeListener = onRecipeListener;
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.elemento_lista2, parent, false);
        return new ViewHolder(view, mOnRecipeListener);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewholder, int position) {
        int resource = listItems.get(position).getImgFoto();
        String title = listItems.get(position).getTitulo();
        String time = listItems.get(position).getTiempo();
        int barra = listItems.get(position).getRating();
        final int priority = listItems.get(position).getPriority();
        //int fondo = listItems.get(position).getColorfondo();
        viewholder.setData(resource, title, time, barra);

        //You can pass the clicked item's priority back to your activity like this
        viewholder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnRecipeListener.OnRecipe(priority);
            }
        });
        // por si necesito color de fondo viewholder.setData(resource, title, time, barra, fondo);
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Entidad2> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(listItemsFull);
            }
            else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (Entidad2 item : listItemsFull) {
                    if (item.getTitulo().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            listItems.clear();
            listItems.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView imgFoto;
        private TextView titulo;
        private TextView tiempo;
        private RatingBar ratingBar;
        //private ImageView colorfondo;
        OnRecipeListener onRecipeListener;

        public ViewHolder(View itemView, OnRecipeListener onRecipeListener) {
            super(itemView);

            imgFoto = itemView.findViewById(R.id.imgFoto);
            titulo = itemView.findViewById(R.id.tvTitulo);
            tiempo = itemView.findViewById(R.id.tvTiempo);
            ratingBar = itemView.findViewById(R.id.ratingBarVerd);
            //colorfondo = itemView.findViewById(R.id.colorfondo);
            // this.onRecipeListener = onRecipeListener;

        }

        //por si necesito color de fondo private void setData(int resource, String title, String time, int barra, int fondo){
        private void setData(int resource, String title, String time, int barra){
            imgFoto.setImageResource(resource);
            titulo.setText(title);
            tiempo.setText(time);
            ratingBar.setRating(barra);
            //colorfondo.setImageResource(fondo);

        }

        @Override
        public void onClick(View v) {
        }
    }

    public interface OnRecipeListener{
        void OnRecipe(int priority);
    }
}

But an error appears:

Please help I'm not sure of what to do because i've never used a SearchView, so any help will be useful.

Thanks

The new problem appearing when i try to get into the activity while running the app:

08-14 16:33:07.115 17470-17470/com.test.platos_4 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.platos_4, PID: 17470
    java.lang.ClassCastException: android.support.v7.widget.SearchView cannot be cast to android.widget.SearchView
        at com.test.platos_4.Dishes.onCreateOptionsMenu(Dishes.java:136)
        at android.app.Activity.onCreatePanelMenu(Activity.java:3546)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:328)
        at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:93)
        at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:332)
        at android.support.v7.app.AppCompatDelegateImplV9.preparePanel(AppCompatDelegateImplV9.java:1370)
        at android.support.v7.app.AppCompatDelegateImplV9.doInvalidatePanelMenu(AppCompatDelegateImplV9.java:1650)
        at android.support.v7.app.AppCompatDelegateImplV9$1.run(AppCompatDelegateImplV9.java:134)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6815)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
08-14 16:33:07.119 17470-17470/com.test.platos_4 E/MQSEventManagerDelegate: failed to get MQSService.

解决方案

the getFilter() error you see is because you are trying to call getFilter() on Adaptador2, but since getFilter() isn't a static method you need to call it on an instance of the adapter, not the adapter class like someInstanceOfAdapterClass.getFilter()

One main issue is that your naming your adaptador class instance with the same name as the class which is a really bad idea... On these lines here:

Adaptador2 Adaptador2 = new Adaptador2(listItems, this); // this is bad
recyclerView.setAdapter(Adaptador2);
Adaptador2.notifyDataSetChanged();

you want to rename the variable to something different then the class name, a common thing to do would be to use a lowercase. You'll also need to keep track of it in your activities variables so it can be accessed in onCreateOptionsMenu so do something like this:

// at the top of your main activity define it
private Adaptador2 adaptador2;

// create your instance of it 
adaptador2 = new Adaptador2(listItems, this);
recyclerView.setAdapter(adaptador2);
adaptador2.notifyDataSetChanged();

// in onCreateOptionsMenu use lower case one to reference the object instance not 
// the class 
adaptador2.getFilter().filter(newText);


(I haven't tested this but it may work)

As for hiding the recycler view, you could just do something in your onQueryChanged method like this:

@Override
public boolean onQueryTextChange(String newText) {
    // this will hide your recycler anytime the search query is empty
    // and show it anytime there is a search query
    if (newText == "") {
        recyclerView.setVisibilty(View.GONE);
    } else {
        recyclerView.setVisibilty(View.VISIBLE);
    }

    adaptador2.getFilter().filter(newText);
    return false;
}

这篇关于如何在不始终显示recyclerview的情况下使用searchview?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆