Cómo usar la funcionalidad de búsqueda en la vista de lista personalizada en Android

He creado una vista de lista con varios elementos en fila. También he creado un cuadro de búsqueda arriba. Quiero implementar la funcionalidad de búsqueda sobre la base de campos particulares de la lista. ¿Cómo puedo conseguir esto? Cualquier ayuda será apreciada.

Debe usar model, listview y customadapter con filtrado para esto. He creado una demostración para esto.

Supongamos que tiene un modelo llamado Producto y está mostrando su contenido en una vista de lista personalizada donde el nombre y el precio se muestran en una vista de texto. Quiero decir en una fila personalizada que tiene dos textviews, y desea filtrar la lista por uno del campo de la fila personalizada. Aquí he filtrado con “nombre”

Capturas de pantalla:

Inicial

Inicial

Filtrado

Filtrado

Código fuente

Modelo

public class Product { public String name; public Integer price; public Product(String name, Integer price) { super(); this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } } 

Actividad con adaptador personalizado y vista de lista

 public class MainActivity extends Activity { private LinearLayout llContainer; private EditText etSearch; private ListView lvProducts; private ArrayList mProductArrayList = new ArrayList(); private MyAdapter adapter1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialize(); // Add Text Change Listener to EditText etSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Call back the Adapter with current character to Filter adapter1.getFilter().filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { } }); } private void initialize() { etSearch = (EditText) findViewById(R.id.etSearch); lvProducts = (ListView)findViewById(R.id.lvOS); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mProductArrayList.add(new Product("a", 100)); mProductArrayList.add(new Product("b", 200)); mProductArrayList.add(new Product("c", 300)); mProductArrayList.add(new Product("d", 400)); mProductArrayList.add(new Product("e", 500)); mProductArrayList.add(new Product("f", 600)); mProductArrayList.add(new Product("g", 700)); mProductArrayList.add(new Product("h", 800)); mProductArrayList.add(new Product("i", 900)); mProductArrayList.add(new Product("j", 1000)); mProductArrayList.add(new Product("k", 1100)); mProductArrayList.add(new Product("l", 1200)); mProductArrayList.add(new Product("m", 1000)); mProductArrayList.add(new Product("n", 1300)); mProductArrayList.add(new Product("o", 1400)); mProductArrayList.add(new Product("p", 1500)); adapter1 = new MyAdapter(MainActivity.this, mProductArrayList); lvProducts.setAdapter(adapter1); } // Adapter Class public class MyAdapter extends BaseAdapter implements Filterable { private ArrayList mOriginalValues; // Original Values private ArrayList mDisplayedValues; // Values to be displayed LayoutInflater inflater; public MyAdapter(Context context, ArrayList mProductArrayList) { this.mOriginalValues = mProductArrayList; this.mDisplayedValues = mProductArrayList; inflater = LayoutInflater.from(context); } @Override public int getCount() { return mDisplayedValues.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } private class ViewHolder { LinearLayout llContainer; TextView tvName,tvPrice; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.row, null); holder.llContainer = (LinearLayout)convertView.findViewById(R.id.llContainer); holder.tvName = (TextView) convertView.findViewById(R.id.tvName); holder.tvPrice = (TextView) convertView.findViewById(R.id.tvPrice); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvName.setText(mDisplayedValues.get(position).name); holder.tvPrice.setText(mDisplayedValues.get(position).price+""); holder.llContainer.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(MainActivity.this, mDisplayedValues.get(position).name, Toast.LENGTH_SHORT).show(); } }); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint,FilterResults results) { mDisplayedValues = (ArrayList) results.values; // has the filtered values notifyDataSetChanged(); // notifies the data with new filtered values } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values ArrayList FilteredArrList = new ArrayList(); if (mOriginalValues == null) { mOriginalValues = new ArrayList(mDisplayedValues); // saves the original data in mOriginalValues } /******** * * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values * else does the Filtering and returns FilteredArrList(Filtered) * ********/ if (constraint == null || constraint.length() == 0) { // set the Original result to return results.count = mOriginalValues.size(); results.values = mOriginalValues; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mOriginalValues.size(); i++) { String data = mOriginalValues.get(i).name; if (data.toLowerCase().startsWith(constraint.toString())) { FilteredArrList.add(new Product(mOriginalValues.get(i).name,mOriginalValues.get(i).price)); } } // set the Filtered result to return results.count = FilteredArrList.size(); results.values = FilteredArrList; } return results; } }; return filter; } } } 

activity_main.xml

 < ?xml version="1.0" encoding="utf-8"?>     

row.xml

 < ?xml version="1.0" encoding="utf-8"?>     

para esto, primero necesitas agregar un texto de edición, donde escribirás para filtrar los datos de la lista,

luego habilite la filtración en la lista,

 editText = (EditText) findViewById(R.id.searchList); adapter = new CustomListViewAdapter(this, R.layout.list_row, rowItems); listView.setAdapter(adapter); listView.setTextFilterEnabled(true); 

Entonces necesitas agregar TextChangeListener() para el texto de edición,

 editText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void afterTextChanged(Editable arg0) { MyActivityName.this.adapter.getFilter().filter(arg0); } }); 

Use el siguiente tipo de método.

 your edit text box.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable theWatchedText) { } }); } 

Puede establecer un TextWatcher para su cuadro de búsqueda y cambiar su Cursor onTextChanged () en TextWatcher como los Códigos a continuación:

 TextWatcher filterNameTextWatcher = new TextWatcher() public void beforeTextChanged(CharSequence s, int start, int count,int after) { } public void onTextChanged(CharSequence s,int start, int before,int count) { Cursor FilteredNameList = ZoneCardDBAdapter.instance.CursorFilteredName(s.toString()); Listadapter.changeCursor(FilteredNameList); } @Override public void afterTextChanged(Editable arg0) { } }; EditText filterTextName = (EditText)this.findViewById(R.id.edtZoneCardNameFilter); filterTextCPName.addTextChangedListener(filterNameTextWatcher);