将SearchView与具有图像和文本的ListView一起使用

时间:2018-04-26 21:20:22

标签: java android listview search searchview

我遇到了问题,我学会了如何使用带有文本的SearchView,但我有一个Activity,其中listView有图像和文本,但我找不到显示过滤器的方法。

所以,我调试代码是为了理解为什么会这样,我在LogCat中得到了这个:

java.lang.RuntimeException:无法启动活动ComponentInfo {mundo.hola.app.frank.com.universidad2 / mundo.hola.app.frank.com.universidad2.RankingActividad}:java.lang.NullPointerException:Attempt to在空对象引用上调用虚方法'void android.widget.SearchView.setOnQueryTextListener(android.widget.SearchView $ OnQueryTextListener)'

代码编译得很好,但当我尝试通过Intent访问此活动时,应用程序崩溃了。

如果有人可以帮助我,我会很高兴。

活性

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbarLayout_po"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <android.support.v7.widget.Toolbar
        android:id="@+id/appbar_rank"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        >

        <ImageView
            android:id="@+id/home_rank"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:scaleType="center"
            tools:ignore="ContentDescription"
            android:src="@drawable/ic_first_page_24dp" />

        <SearchView
            android:id="@+id/search_tecnico"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <requestFocus />
        </SearchView>

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

</android.support.design.widget.AppBarLayout>


<ListView
    android:id="@+id/rankinglista"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

item_list

<?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:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorBlanco"
android:foreground="?attr/selectableItemBackground"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="8dp">

<ImageView
    android:id="@+id/imagenR"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:layout_centerVertical="true" />

<TextView
    android:id="@+id/tv_nombreUR"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="false"
    android:layout_marginLeft="56dp"
    android:layout_marginStart="65dp"
    android:textColor="@android:color/black"
    tools:text="NombreU" />

<TextView
    android:id="@+id/tv_PuntajeR"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/tv_nombreUR"
    android:layout_alignStart="@+id/tv_nombreUR"
    android:layout_below="@+id/tv_nombreUR"
    tools:text="Puntaje" />
<TextView
    android:id="@+id/tv_NpuntajeR"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/tv_PuntajeR"
    android:layout_alignParentBottom="false"
    android:layout_alignStart="@+id/tv_PuntajeR"
    android:layout_alignWithParentIfMissing="false"
    android:layout_below="@+id/tv_PuntajeR"
    android:textColor="@android:color/holo_red_dark"
    tools:text="11223344" />

</RelativeLayout>

班级排名

public class Ranking {

private int Id;
private String Titulo;
private String Puntaje;
private String NPuntaje;
private int Imagen;

public Ranking(int id, String titulo, String puntaje, String NPuntaje, int imagen) {
    Id = id;
    Titulo = titulo;
    Puntaje = puntaje;
    this.NPuntaje = NPuntaje;
    Imagen = imagen;
}

public int getId() {
    return Id;
}

public void setId(int id) {
    Id = id;
}

public String getTitulo() {
    return Titulo;
}

public void setTitulo(String titulo) {
    Titulo = titulo;
}

public String getPuntaje() {
    return Puntaje;
}

public void setPuntaje(String puntaje) {
    Puntaje = puntaje;
}

public String getNPuntaje() {
    return NPuntaje;
}

public void setNPuntaje(String NPuntaje) {
    this.NPuntaje = NPuntaje;
}

public int getImagen() {
    return Imagen;
}

public void setImagen(int imagen) {
    Imagen = imagen;
}
}

活动类

public class RankingActividad extends AppCompatActivity  {


ImageView inicio1;
SearchView sv;
Toolbar toolbar1;
ListView listadatos;
ArrayList<Ranking> Lista;

@Override
public void onBackPressed() {

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ranking_actividad);

    inicio1 = (ImageView) findViewById(R.id.home_rank);
    sv = (SearchView) findViewById(R.id.search);
    toolbar1 = (Toolbar) findViewById(R.id.appbar_rank);
    listadatos = (ListView) findViewById(R.id.rankinglista);
    Lista = new ArrayList<Ranking>();


    Lista.add(new Ranking(1,"Universidad 1","Puntaje","4512",R.drawable.ufps));
    Lista.add(new Ranking(2,"universidad 2","Puntaje","4512",R.drawable.unip));
    Lista.add(new Ranking(3,"universidad 3","Puntaje","4512",R.drawable.ufps));
    Lista.add(new Ranking(4,"universidad 4","Puntaje","4512",R.drawable.ufps));

    final RankingAdaptador rankingAdaptador = new RankingAdaptador(getApplicationContext(),Lista);
    listadatos.setAdapter(rankingAdaptador);



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

        @Override
        public boolean onQueryTextChange(String s) {
            if(TextUtils.isEmpty(s)){
                rankingAdaptador.filter("");
                listadatos.clearTextFilter();
            }else{
                String texto = s;
                rankingAdaptador.filter(s);
            }
            return true;
        }
    });

适配器类

public class RankingAdaptador extends  BaseAdapter {

Context context;
LayoutInflater inflater;
List<Ranking> ListaObjetos;
private ArrayList<Ranking> arraylist;


public RankingAdaptador(Context context, List<Ranking> listaObjetos) {
    this.context = context;
    ListaObjetos = listaObjetos;
    inflater = LayoutInflater.from(context);
    this.arraylist = new ArrayList<Ranking>();
    this.arraylist.addAll(ListaObjetos);
}

public class ViewHolder{
    TextView mtitulo,mpuntaje,npuntaje;
    ImageView mimagen;
}

@Override
public int getCount() {
    return ListaObjetos.size();  //retorna la cantidad de elementos de la lista
}

@Override
public Object getItem(int i) {
    return ListaObjetos.get(i);
}

@Override
public long getItemId(int i) {
    return ListaObjetos.get(i).getId();
}

@Override
public View getView(int position, View view, ViewGroup parent) {

    ViewHolder holder;

    if (view==null){
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.ranking_item_lista,null);

        // localizar los items de la lista
        holder.mimagen = view.findViewById(R.id.imagenR);
        holder.mtitulo = view.findViewById(R.id.tv_nombreUR);
        holder.mpuntaje = view.findViewById(R.id.tv_PuntajeR);
        holder.npuntaje = view.findViewById(R.id.tv_NpuntajeR);

        view.setTag(holder);
    }else {
        holder = (ViewHolder)view.getTag();
    }

    // setear los textos de la lista
    holder.mtitulo.setText(ListaObjetos.get(position).getTitulo());
    holder.mpuntaje.setText(ListaObjetos.get(position).getPuntaje());
    holder.npuntaje.setText(ListaObjetos.get(position).getNPuntaje());
    // setear las imagenes de la lista
    holder.mimagen.setImageResource(ListaObjetos.get(position).getImagen());

    return null;
}

public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    ListaObjetos.clear();
    if (charText.length() == 0) {
        ListaObjetos.addAll(arraylist);
    } else {
        for (Ranking wp : arraylist) {
            if (wp.getTitulo().toLowerCase(Locale.getDefault()).contains(charText)) {
                ListaObjetos.add(wp);
            }
        }
    }
    notifyDataSetChanged();
}}

1 个答案:

答案 0 :(得分:0)

sv.setOnQueryTextListener(new Sear...

你从未初始化过sv,所以它是null。加上这个:

sv = (SearchView) findViewById(R.id.search_tecnico);