AddTextChangedListener con listview con subtexto

Quiero buscar a través de la lista y mostrar el resultado en la lista de nuevo, así que he utilizado addtextchangelistener, pero no puedo encontrar una manera de hacerlo funcionar con listview con subtext

Aquí está mi código:

package com.android; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import android.app.ListActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; public class MyListDemoActivity extends ListActivity { /** Called when the activity is first created. */ TextView tv; //** List<String> content; EditText actv; List<String> arr_sort; //** ArrayAdapter<String> adapter; SimpleAdapter simpleadapter; ListView lv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String line = " "; LineNumberReader linenoreader = null; StringTokenizer stringtokanixer = null; //** content = new ArrayList<String>(); List<Map<String,String>> data= new ArrayList<Map<String,String>>(); lv = (ListView) findViewById(android.R.id.list); try { InputStream istream = getResources().openRawResource(R.raw.grelist); InputStreamReader streamreader = new InputStreamReader(istream); linenoreader = new LineNumberReader(streamreader); linenoreader.mark(15); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }// try catch ends here Log.v("getting", "working"); for(int i=0;i<8;i++) { Map<String,String> datum= new HashMap<String,String>(2); try { line = linenoreader.readLine(); Log.v("item",line); } catch (IOException e) { e.printStackTrace(); } Log.v("getting", line); stringtokanixer = new StringTokenizer(line); String st = stringtokanixer.nextToken(); String meaning=""; while (stringtokanixer.hasMoreTokens()) { meaning +=" " +stringtokanixer.nextToken(); }// for ends // map is used to add word and meaning datum.put("word",st); datum.put("meaning",meaning); data.add(datum); //List<String> is usedto add //** content.add(st); } simpleadapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"word","meaning"}, new int[]{android.R.id.text1,android.R.id.text2}); // setListAdapter(adapter); lv.setAdapter(simpleadapter); tv = (TextView) findViewById(R.id.textView1); actv = (EditText) findViewById(R.id.editText1); /* actv.addTextChangedListener(new TextWatcher() { int len = 0; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { arr_sort = new ArrayList<String>(); len = actv.getText().length(); for (int i = 0; i < content.size(); i++) { if (len <= content.get(i).length()) { if (actv.getText() .toString() .trim() .equalsIgnoreCase( (String) content.get(i).subSequence(0, len))) { arr_sort.add(content.get(i)); Log.v("infor loop afterTextChanged", s.toString()); } } } // adapter.notifyDataSetChanged(); adapter = new ArrayAdapter<String>(MyListDemoActivity.this, android.R.layout.simple_list_item_1, arr_sort); setListAdapter(adapter); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.v("beforetextchange","hello here"); } @Override public void afterTextChanged(Editable s) { Log.v("aftertextchange","hello here"); } }); // text watcher class ends here */ }// on create ends here public void onListItemClick(ListView ls, View v, int position, long id) { //tv.setText(content.get(position)); // tv.setText(content[position]) // in case of string }// endsd here onListItemClick( } 

4 Solutions collect form web for “AddTextChangedListener con listview con subtexto”

Aquí es cómo cambiaría su código para que funcione:

1. arr_sort variable arr_sort , y añadiría otra ArrayList de Maps para retener los valores filtrados:

 // List<String> arr_sort; final ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>(); final ArrayList<Map<String, String>> filteredData = new ArrayList<Map<String, String>>(); 

También los haría definitivos, ya que no tiene sentido asignarles valores completamente nuevos mientras podamos modificar su contenido.

2. El simpleadapter siempre debe mostrar los datos filtrados, por lo que tiene que ser modificado:

 filteredData.addAll(data); // fill up filteredData initially with the whole list simpleadapter = new SimpleAdapter(this, filteredData, android.R.layout.simple_list_item_2, new String[] { "word", "meaning" }, new int[] {android.R.id.text1, android.R.id.text2 }); 

3. Luego movería el código de filtrado del método afterTextChanged método afterTextChanged para realizar el filtrado basado en todo el texto ingresado. El uso de Regexp también consume menos recursos que todas las manipulaciones String (+, substring …)

De esta manera su implementación TextWatcher se vería así:

 actv.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 s) { Log.v("MLDA", "afterTextChanged"); // a temporary source list for better performance: // if it's possible, use the smaller filtered list final ArrayList<Map<String, String>> tmpSource = new ArrayList<Map<String,String>>(); tmpSource.addAll( (filterText.length() > 0 && s.toString().contains(filterText)) ? filteredData : data); filterText = s.toString(); // a temporary result list to fill with the filtered data final ArrayList<Map<String, String>> tmpResult = new ArrayList<Map<String,String>>(); if (filterText.length() == 0) tmpResult.addAll(data); //if no filter, return the base data else { final Pattern pattern = Pattern.compile("(?i)" + Pattern.quote(s.toString())); Matcher matcher; for (final Map<String, String> map : tmpSource) { //first match against the "word": matcher = pattern.matcher(map.get("word")); if (!matcher.find()) { //if no matches were found, try to match the "meaning" matcher = pattern.matcher(map.get("meaning")); if (!matcher.find()) continue; //if no match, move to the next map } tmpResult.add(map); //match found: add to new list } } filteredData.clear(); filteredData.addAll(tmpResult); simpleadapter.notifyDataSetChanged(); // update display } }); 

Trabajar con listas temporales le permite crear los datos filtrados enteros sin actualizaciones gui (si quita / agrega elementos a la lista filteredData directamente, el adaptador activaría métodos de actualización).

Observe también que al examinar si el nuevo texto de filtro contiene el antiguo, podemos usar la lista filteredData actual como fuente.

Del mismo modo, si el filterText es una cadena vacía, no hay ningún punto para realizar ninguna coincidencia, simplemente podemos devolver la lista de base .

He respondido ya en dos de las preguntas StackOverflow en sí se les puede,

Primero está usando getFilter() que android proporciona para el filtrado usando la interfaz de Filterable a la clase Adapter. Puedes comprobarlo desde here .

En segundo lugar está utilizando un jar externo Lambdaj que es la manera mejor y más eficiente de filtrar una gran cantidad de datos de una lista. Usted puede comprobar que también desde here .

Lo que entendí es: – Simplemente desea filtrar el ListView . ¿Derecha?

¡Déjeme saber si he entendido mal la pregunta !!!

Main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:id="@+id/search" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

ListViewSearchActivity

 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleAdapter; public class ListViewSearchActivity extends Activity implements TextWatcher { private SimpleAdapter simpleAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); EditText search = (EditText) findViewById(R.id.search); search.addTextChangedListener(this); List<Map<String, String>> data = new ArrayList<Map<String, String>>(); for(int i=0;i<8;i++) { Map<String,String> map = new HashMap<String, String>(2); map.put("word", "word " + i); map.put("meaning", "meaning " + (i + 10)); data.add(map); } ListView listView = (ListView) findViewById(R.id.list); this.simpleAdapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"word","meaning"}, new int[]{android.R.id.text1,android.R.id.text2}); listView.setAdapter(this.simpleAdapter); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { this.simpleAdapter.getFilter().filter(s.toString()); } } 
 ArrayList<String> tempList ; edtText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub if (!edtText.getText().toString().equalsIgnoreCase("")){ tempList = new ArrayList<String>(); tempList.clear(); String text = filterText.getText().toString(); for(int i=0 ;i< listname.size();i++){ //if(globalconstant.mosq_list.get(globalconstant.hashformosq.get(globalconstant.tempList.get(i))).name.toUpperCase().toString().contains(text.toUpperCase())){ if(listname.get(i).toUpperCase().toString().contains(text.toUpperCase())){ tempList.add(listname.get(i)); } } used changed tempList }else{ unchaged tempList } } }); } 
  • Tamaño de fuente a grande para caber en caché para Emoji en Kitkat solamente
  • Texto en círculo en movimiento circular
  • Puedo cambiar el aspecto y la sensación de la clickablespan
  • Cómo agregar borde a un texto en textview android
  • ¿Cómo mostrar el archivo .rtf dentro de TextView?
  • Problema de superposición de texto en ViewFlipper ..
  • Desactivar la conversión de palabras en un TextView multi-línea de Android
  • Reducir la altura y el ancho de ImageSpan
  • Android: ¿Cómo crear un TextView circular?
  • Cómo deshabilitar Word-wrap en Multiline Android TextView?
  • ¿Hay de todos modos hacer automáticamente un TextView ir a una nueva línea después de una cierta cantidad de caracteres?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.