2012-05-30 12 views
5

Tengo ListView. Cada fila contiene 3 TextView y 2 Button. Arriba tengo un EditText. ¿Cómo puedo filtrar mi ListView por el valor en el primer TextView de cada fila?Buscar en ListView con EditText

+0

http://samir-mangroliya.blogspot.in/2012/05/android-sectioned-listview-with-search_6865.html –

+0

Compruebe esto: [-search Android listview] (http://stackoverflow.com/a/5180156/379693) –

+0

cambie "serach" a "buscar" para una mejor referencia – Tschegewara

Respuesta

2

crear alguna lista de arreglo de la vista de lista ..Y en "AddTextChangeListener" puede buscar similares elementos en la lista y cargar una nueva lista de arrays para th e buscado texto ...

edittext.addTextChangedListener(new TextWatcher(){ 
public void afterTextChanged(Editable s) { 
    //search for the keyword and add the items to a new arraylist 
} 
1

El siguiente código utiliza un adaptador de lista personalizado.

Tengo 3 vistas de texto mostradas usando un adaptador de lista personalizado. Hice una muestra que realiza una búsqueda basada en la entrada en editext en la parte superior de la lista. En base a la comparación de entrada, se realiza con datos en textview1 de cada fila y los datos se filtran y se muestran en consecuencia.

Puede tener otros elementos en la fila de vista de lista y la búsqueda se puede basar en texview1/textview2 o textview3. Modifique el siguiente de acuerdo a sus necesidades.

public class MainActivity extends Activity { 
ArrayList<NewData> mTemp=new ArrayList<NewData>(); 
ArrayList<NewData> mPostingData=new ArrayList<NewData>(); 
ArrayList< NewData> mOri = new ArrayList<NewData>(); 

Myadapter ma; 
EditText search; 

NewData nd; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    for(int i = 0; i < 20; i++) 
    { 

     nd=new NewData(); 

     nd.newDatacus.put(NewData.TAG_CUSTOMER_CODE, "i"+i); 
     nd.newDatacus.put(NewData.TAG_CUSTOMER_NAME, "a"+i); 
     nd.newDatacus.put(NewData.TAG_CUSTOMER_MOBILE, "number"); 
     nd.newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS, "address"); 
     mOri.add(nd); 
    } 

    ma= new Myadapter(MainActivity.this); 
    mPostingData=mOri; 
    mTemp=mOri; 
    ListView lv= (ListView) findViewById(R.id.list); 
    lv.setAdapter(ma); 
    search= (EditText) findViewById(R.id.search); 
    search.addTextChangedListener(new TextWatcher() { 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      ma.getFilter().filter(s); 
      ma.notifyDataSetChanged(); 

     } 

     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 


     } 

     public void afterTextChanged(Editable s) { 
     } 
    }); 


} 



class Myadapter extends ArrayAdapter 
{ 
    LayoutInflater mInflater; 


    public void setData(ArrayList<NewData> mPpst) { 
     mPostingData = mPpst;//contains class items data. 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       if (results != null && results.count >= 0) { 
        setData((ArrayList<NewData>) results.values);//if results of search is null set the searched results data 
       } else { 
        setData(mOri);// set original values 
       } 

       notifyDataSetInvalidated(); 
      } 



      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults result = new FilterResults(); 
       if (!TextUtils.isEmpty(constraint)) { 
        constraint = constraint.toString().toLowerCase(); 
        ArrayList<NewData> foundItems = new ArrayList<NewData>(); 
        if(mTemp!=null) 
        { 
         for(int i=0;i<mTemp.size();i++) 
         { 

          if (mTemp.get(i).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString().contains(constraint)) { 
           System.out.println("My datas"+mTemp.get(i).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString()); 
           foundItems.add(mTemp.get(i)); 

          } 
          else 
          { 

          } 
         } 
        } 
        result.count = foundItems.size();//search results found return count 
        result.values = foundItems;// return values 
       } 
       else 
       { 
        result.count=-1;// no search results found 
       } 


       return result; 
      } 
     }; 
    } 
    public Myadapter(Context context) { 
     super(context, 0); 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return mPostingData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder holder; 


     if(mOri == null){ 

      return null; 
     } 
     // When convertView is not null, we can reuse it directly, there is no need 
     // to reinflate it. We only inflate a new View when the convertView supplied 
     // by ListView is null. 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list, null); 
      convertView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 
      // Creates a ViewHolder and store references to the two children views 
      // we want to bind data to. 
      holder = new ViewHolder(); 
      holder.t1=(TextView) convertView.findViewById(R.id.textView1); 
      holder.t2 = (TextView) convertView.findViewById(R.id.textView2); 
      holder.t3 = (TextView) convertView.findViewById(R.id.textView3); 

      convertView.setTag(holder); 
     } else { 
      // Get the ViewHolder back to get fast access to the TextView 
      // and the ImageView. 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.t1.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString()); 
     holder.t2.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_NAME).toString()); 
     holder.t3.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_MOBILE).toString()); 
     return convertView; 
    } 
} 
class ViewHolder 
{ 
    TextView t1,t2,t3; 
} 

Main.xml

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

<EditText 
    android:id="@+id/search" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

<ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

list.xml // xml para inflar

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

<TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

clase NewData

public class NewData { 
    public static final String TAG_CUSTOMER_CODE = "customer_code"; 
    public static final String TAG_CUSTOMER_NAME = "customer_name"; 
    public static final String TAG_CUSTOMER_MOBILE = "customer_mobile"; 
    public static final String TAG_CUSTOMER_ADDRESS = "customer_address"; 

    Hashtable newDatacus=new Hashtable(); 

    public NewData() 
    { 

    newDatacus.put(NewData.TAG_CUSTOMER_CODE,new String()); 
    newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS,new String()); 
    newDatacus.put(NewData.TAG_CUSTOMER_NAME,new String()); 
    newDatacus.put(NewData.TAG_CUSTOMER_MOBILE,new String()); 
    newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS,new String()); 




} 
} 
+0

intente con el código anterior y modifique según corresponda – Raghunandan

Cuestiones relacionadas