Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


SearchView en ListView con un adaptador personalizado

Chicos Estoy necesitando una cierta ayuda. He estado intentando implementar un SearchView en mi proyecto. Pero mi proyecto contiene un listview con un adaptador de encargo asociado a él. He buscado muchos sitios pero todos tienen ejemplos implementados usando un arrayadapter. . Vamos a decir que tengo una clase de empleado y que contiene el nombre y los campos de edad. ¿Cómo puedo filtrar a los empleados con su nombre sólo ..

public class MainActivity extends Activity implements SearchView.OnQueryTextListener { SearchView mSearchView; ListView mListView; //String mStrings[]= {"abc","def","efg","ghi","ijk","apple","agxhsdgc","abbbcc"}; ArrayList<Employee> emp_list=null; EmployeeAdapter emp_adapter=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSearchView=(SearchView) findViewById(R.id.searchView1); mListView=(ListView) findViewById(R.id.listView1); emp_list=new ArrayList<Employee>(); emp_list.add(new Employee("ABC", 24)); emp_list.add(new Employee("ACB", 24)); emp_list.add(new Employee("BVF", 28)); emp_list.add(new Employee("BRT", 28)); emp_list.add(new Employee("ANM", 23)); emp_adapter=new EmployeeAdapter(MainActivity.this, emp_list); mListView.setAdapter(emp_adapter); // mListView.setAdapter(new ArrayAdapter<String>(this, // android.R.layout.simple_list_item_1, // mStrings)); mListView.setTextFilterEnabled(true); setupSearchView(); } private void setupSearchView() { mSearchView.setIconifiedByDefault(false); mSearchView.setOnQueryTextListener(this); mSearchView.setSubmitButtonEnabled(true); mSearchView.setQueryHint("Search Here"); } @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText.toString())) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText.toString()); } return true; } @Override public boolean onQueryTextSubmit(String query) { return false; } } 

Y esta es mi clase de adaptador que extiende BaseAdapter ..

  • Color de fondo del menú de opciones de la barra de herramientas
  • Java.lang.SecurityException: inválido nombre del paquete: com.google.android.gms
  • Sala de pruebas de unidad y LiveData
  • ¿Cómo obtener los contactos de un grupo de WhatsApp en Android?
  • ¿Cómo detectar cuando el usuario activa / desactiva el estado del GPS?
  • ¿Dónde puedo descargar la documentación de Android SDK?
  •  public class EmployeeAdapter extends BaseAdapter { Context ctx; ArrayList<Employee> emp_list; LayoutInflater linf=null; EmployeeHolder holder=null; public EmployeeAdapter(Context ctx, ArrayList<Employee> emp_list) { super(); this.ctx = ctx; this.emp_list = emp_list; linf=(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public class EmployeeHolder { TextView name; TextView age; } @Override public int getCount() { // TODO Auto-generated method stub return emp_list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return emp_list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null) { convertView=linf.inflate(R.layout.row, parent, false); holder=new EmployeeHolder(); holder.name=(TextView) convertView.findViewById(R.id.name); holder.age=(TextView) convertView.findViewById(R.id.age); convertView.setTag(holder); } else { holder=(EmployeeHolder) convertView.getTag(); } Employee e=(Employee) getItem(position); holder.name.setText(e.getName()); holder.age.setText(String.valueOf(e.getAge())); return convertView; } } 

    Gracias por adelantado..

  • Cómo configurar el relleno para el widget CardView en Android L
  • ¿Cómo puedo definir una anotación Android personalizada (por ejemplo, @Background)
  • WebView textarea no aparece el teclado
  • ¿Quieres saber más sobre la cola de eventos de subprocesos de la interfaz de usuario de Android
  • No se puede modificar ArrayAdapter en ListView: UnsupportedOperationException
  • Zxing onActivityResult no se llama en Fragmento sólo en Actividad
  • 3 Solutions collect form web for “SearchView en ListView con un adaptador personalizado”

    Prueba de esta manera, espero que esto te ayude …

    Activity_main.xml

      <SearchView android:id="@+id/searchView1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> 

    Row.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/txtName" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/txtAge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp"/> </LinearLayout> 

    MainActivity.java

     public class MainActivity extends Activity implements SearchView.OnQueryTextListener { private SearchView mSearchView; private ListView mListView; private ArrayList<Employee> employeeArrayList; private EmployeeAdapter employeeAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSearchView=(SearchView) findViewById(R.id.searchView1); mListView=(ListView) findViewById(R.id.listView1); employeeArrayList=new ArrayList<Employee>(); employeeArrayList.add(new Employee("ABC", 24)); employeeArrayList.add(new Employee("ACB", 24)); employeeArrayList.add(new Employee("BVF", 28)); employeeArrayList.add(new Employee("BRT", 28)); employeeArrayList.add(new Employee("ANM", 23)); employeeAdapter=new EmployeeAdapter(MainActivity.this, employeeArrayList); mListView.setAdapter(employeeAdapter); mListView.setTextFilterEnabled(true); setupSearchView(); } private void setupSearchView() { mSearchView.setIconifiedByDefault(false); mSearchView.setOnQueryTextListener(this); mSearchView.setSubmitButtonEnabled(true); mSearchView.setQueryHint("Search Here"); } @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText); } return true; } @Override public boolean onQueryTextSubmit(String query) { return false; } } 

    EmployeeAdapter.java

     public class EmployeeAdapter extends BaseAdapter implements Filterable { public Context context; public ArrayList<Employee> employeeArrayList; public ArrayList<Employee> orig; public EmployeeAdapter(Context context, ArrayList<Employee> employeeArrayList) { super(); this.context = context; this.employeeArrayList = employeeArrayList; } public class EmployeeHolder { TextView name; TextView age; } public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { final FilterResults oReturn = new FilterResults(); final ArrayList<Employee> results = new ArrayList<Employee>(); if (orig == null) orig = employeeArrayList; if (constraint != null) { if (orig != null && orig.size() > 0) { for (final Employee g : orig) { if (g.getName().toLowerCase() .contains(constraint.toString())) results.add(g); } } oReturn.values = results; } return oReturn; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { employeeArrayList = (ArrayList<Employee>) results.values; notifyDataSetChanged(); } }; } public void notifyDataSetChanged() { super.notifyDataSetChanged(); } @Override public int getCount() { return employeeArrayList.size(); } @Override public Object getItem(int position) { return employeeArrayList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { EmployeeHolder holder; if(convertView==null) { convertView=LayoutInflater.from(context).inflate(R.layout.row, parent, false); holder=new EmployeeHolder(); holder.name=(TextView) convertView.findViewById(R.id.txtName); holder.age=(TextView) convertView.findViewById(R.id.txtAge); convertView.setTag(holder); } else { holder=(EmployeeHolder) convertView.getTag(); } holder.name.setText(employeeArrayList.get(position).getName()); holder.age.setText(String.valueOf(employeeArrayList.get(position).getAge())); return convertView; } } 

    Employee.java

     public class Employee { private String name; private int age; public Employee(String name,int age){ this.name = name; this.age = age; } public String getName(){ return name; } public int getAge(){ return age; } } 

    La buena respuesta está allí, pero todavía hay algunas ediciones (posición incorrecta cuando onclick, overlay del texto del serchview) según lo mencionado en la sección del comentario, así que usted puede también hacer esto siguiendo la manera

    Referencia para más información: searchview listview android

    Lo he probado y no encuentro ninguna edición hasta ahora, si usted encuentra cualesquiera, por favor mencione en la sección del comentario.

    Clase del modelo: MovieNames.java

     public class MovieNames { private String movieName; public MovieNames(String movieName) { this.movieName = movieName; } public String getAnimalName() { return this.movieName; } } 

    2: archivo listview_item.xml:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> 
    1. ListViewAdapter.java adaptador de clase para listview:

        import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.Locale; public class ListViewAdapter extends BaseAdapter { // Declare Variables Context mContext; LayoutInflater inflater; private ArrayList<MovieNames> arraylist; public ListViewAdapter(Context context ) { mContext = context; inflater = LayoutInflater.from(mContext); this.arraylist = new ArrayList<MovieNames>(); this.arraylist.addAll(MainActivity.movieNamesArrayList); } public class ViewHolder { TextView name; } @Override public int getCount() { return MainActivity.movieNamesArrayList.size(); } @Override public MovieNames getItem(int position) { return MainActivity.movieNamesArrayList.get(position); } @Override public long getItemId(int position) { return position; } public View getView(final int position, View view, ViewGroup parent) { final ViewHolder holder; if (view == null) { holder = new ViewHolder(); view = inflater.inflate(R.layout.listview_item, null); // Locate the TextViews in listview_item.xml holder.name = (TextView) view.findViewById(R.id.name); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } // Set the results into TextViews holder.name.setText(MainActivity.movieNamesArrayList.get(position).getAnimalName()); return view; } // Filter Class public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); MainActivity.movieNamesArrayList.clear(); if (charText.length() == 0) { MainActivity.movieNamesArrayList.addAll(arraylist); } else { for (MovieNames wp : arraylist) { if (wp.getAnimalName().toLowerCase(Locale.getDefault()).contains(charText)) { MainActivity.movieNamesArrayList.add(wp); } } } notifyDataSetChanged(); } } 
    2. MainActivity.java class:

        import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SearchView; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { // Declare Variables private ListView list; private ListViewAdapter adapter; private SearchView editsearch; private String[] moviewList; public static ArrayList<MovieNames> movieNamesArrayList = new ArrayList<MovieNames>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Generate sample data moviewList = new String[]{"Xmen", "Titanic", "Captain America", "Iron man", "Rocky", "Transporter", "Lord of the rings", "The jungle book", "Tarzan","Cars","Shreck"}; // Locate the ListView in listview_main.xml list = (ListView) findViewById(R.id.listview); movieNamesArrayList = new ArrayList<>(); for (int i = 0; i < moviewList.length; i++) { MovieNames movieNames = new MovieNames(moviewList[i]); // Binds all strings into an array movieNamesArrayList.add(movieNames); } // Pass results to ListViewAdapter Class adapter = new ListViewAdapter(this); // Binds the Adapter to the ListView list.setAdapter(adapter); // Locate the EditText in listview_main.xml editsearch = (SearchView) findViewById(R.id.search); editsearch.setOnQueryTextListener(this); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, movieNamesArrayList.get(position).getAnimalName(), Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { String text = newText; adapter.filter(text); return false; } } 

    Código fuente

    https://drive.google.com/open?id=0BzBKpZ4nzNzUOFlxeHhuWmF0Q1U

     package example.abhiandroid.searchviewexample; import android.database.Cursor; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ListView; import android.widget.SearchView; import java.util.ArrayList; public class SearchViewActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { // Declare Variables ListView list; ListViewAdapter adapter; public static SearchView editsearch; String[] animalNameList; ArrayList<AnimalNames> arraylist = new ArrayList<AnimalNames>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); // Generate sample data animalNameList = new String[]{"Lion", "Tiger", "Dog", "Cat", "Tortoise", "Rat", "Elephant", "Fox", "Cow","Donkey","Monkey"}; // Locate the ListView in listview_main.xml list = (ListView) findViewById(R.id.listview); for (int i = 0; i < animalNameList.length; i++) { AnimalNames animalNames = new AnimalNames(animalNameList[i]); // Binds all strings into an array arraylist.add(animalNames); } // Pass results to ListViewAdapter Class adapter = new ListViewAdapter(this, arraylist); // Binds the Adapter to the ListView list.setAdapter(adapter); // Locate the EditText in listview_main.xml editsearch = (SearchView) findViewById(R.id.search); editsearch.setOnQueryTextListener(this); editsearch.setOnSuggestionListener(new SearchView.OnSuggestionListener() { @Override public boolean onSuggestionSelect(int position) { return true; } @Override public boolean onSuggestionClick(int position) { Cursor cursor= editsearch.getSuggestionsAdapter().getCursor(); cursor.moveToPosition(position); String suggestion =cursor.getString(2);//2 is the index of col containing suggestion name. editsearch.setQuery(suggestion,true);//setting suggestion return true; } }); } @Override public boolean onQueryTextSubmit(String query) { Log.e("keshav","query ->"+query); return false; } @Override public boolean onQueryTextChange(String newText) { String text = newText; Log.e("keshav","newText ->"+newText); adapter.filter(text); return false; } } package example.abhiandroid.searchviewexample; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class ListViewAdapter extends BaseAdapter { // Declare Variables Context mContext; LayoutInflater inflater; private List<AnimalNames> animalNamesList = null; private ArrayList<AnimalNames> arraylist; public ListViewAdapter(Context context, List<AnimalNames> animalNamesList) { mContext = context; this.animalNamesList = animalNamesList; inflater = LayoutInflater.from(mContext); this.arraylist = new ArrayList<AnimalNames>(); this.arraylist.addAll(animalNamesList); } public class ViewHolder { TextView name; } @Override public int getCount() { return animalNamesList.size(); } @Override public AnimalNames getItem(int position) { return animalNamesList.get(position); } @Override public long getItemId(int position) { return position; } public View getView(final int position, View view, ViewGroup parent) { final ViewHolder holder; if (view == null) { holder = new ViewHolder(); view = inflater.inflate(R.layout.search_list_view_item, null); // Locate the TextViews in search_list_view_itemiew_item.xml holder.name = (TextView) view.findViewById(R.id.name); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } // Set the results into TextViews holder.name.setText(animalNamesList.get(position).getAnimalName()); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("keshav","click list item ->"+animalNamesList.get(position).getAnimalName()); SearchViewActivity.editsearch.setQuery(animalNamesList.get(position).getAnimalName(), false); Log.e("keshav","click size ->"+animalNamesList.size()); // TOdo size always 1 Important See cs Electric Project in Holostik Log.e("keshav","click size ->"+animalNamesList.get(0).getAnimalName()); } }); return view; } // Filter Class public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); animalNamesList.clear(); if (charText.length() == 0) { animalNamesList.addAll(arraylist); } else { for (AnimalNames wp : arraylist) { if (wp.getAnimalName().toLowerCase(Locale.getDefault()).contains(charText)) { animalNamesList.add(wp); } } } notifyDataSetChanged(); } } package example.abhiandroid.searchviewexample; public class AnimalNames { private String animalName; public AnimalNames(String animalName) { this.animalName = animalName; } public String getAnimalName() { return this.animalName; } } <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <SearchView android:id="@+id/search" android:layout_width="fill_parent" android:layout_height="wrap_content" android:iconifiedByDefault="false"> <requestFocus /> </SearchView> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/search" /> </RelativeLayout> list item.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp"> <TextView android:id="@+id/nameLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Animal : " /> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/nameLabel" /> </RelativeLayout> 

    Codificación feliz

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.