2012-05-30 16 views
5

Ich habe ein ListView. Jede Zeile enthält 3 TextView 's und 2 Button' s. Darüber habe ich eine EditText. Wie kann ich meine ListView durch den Wert in dem ersten TextView jede Zeile filtern?Suchen im Listview mit EditText

+0

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

+0

Check this: [Android -Suche Listenansicht] (http://stackoverflow.com/a/5180156/379693) –

+0

change „serach“ für eine bessere Bezugnahme auf „Suche“ den obigen Code – Tschegewara

Antwort

2

eine Array-Liste für die Listenansicht ..Und auf "AddTextChangeListener" erstellen Sie nach ähnlichen suchen Elemente in der Liste und laden Sie eine neue Arraylist für th e gesuchter Text ...

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

Der folgende Code verwendet einen benutzerdefinierten Listenadapter.

Ich habe 3 Textansichten angezeigt eine benutzerdefinierte Liste-Adapter. Ich habe ein Beispiel erstellt, das basierend auf der Eingabe in editext am Anfang der Liste sucht. Auf der Grundlage der Eingabe wird ein Vergleich mit den Daten in Textview1 jeder Zeile durchgeführt, und die Daten werden entsprechend gefiltert und angezeigt.

können Sie haben andere Elemente in Listview Zeile und die Suche kann auf texview1/textview2 oder textview3 basieren. Ändern Sie das Folgende nach Ihren Bedürfnissen.

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 aufzublasen

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

NewData Klasse

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

zu versuchen und ändern entsprechend – Raghunandan

Verwandte Themen