2012-05-30 10 views
5

Ho un ListView. Ogni riga contiene 3 TextView e 2 Button. Sopra di esso ho un EditText. Come posso filtrare il mio ListView con il valore nel primo TextView di ogni riga?Cerca in ListView con EditText

+0

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

+0

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

+0

cambia "serach" in "cerca" per un riferimento migliore – Tschegewara

risposta

2

creare qualche lista di array per la listview ..E su "AddTextChangeListener" è possibile cercare simile elementi nella lista e caricare un nuovo arraylist per th e testo cercato ...

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

Il seguente codice utilizza un adattatore di elenco personalizzato.

Ho 3 visualizzazioni di testo visualizzate utilizzando un adattatore di elenco personalizzato. Ho creato un campione che esegue la ricerca in base all'input in editext in cima alla lista. In base al confronto di input viene effettuato con i dati in textview1 di ogni riga e i dati vengono filtrati e visualizzati di conseguenza.

È possibile avere altri elementi nella riga listview e la ricerca può essere basata su texview1/textview2 o textview3. Modifica il seguito in base alle tue esigenze.

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 per gonfiare

<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" /> 

classe 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

prova il codice sopra e modifica di conseguenza – Raghunandan