Search in ListView with EditText

前端 未结 3 1021
栀梦
栀梦 2020-11-27 07:58

I have a ListView. Each row of it contains 3 TextView\'s and 2 Button\'s. Above it I have an EditText. How can I filter m

相关标签:
3条回答
  • 2020-11-27 08:31

    The below code uses a custom list adapter.

    I have 3 text views displayed using a custom list adapter. I made a sample which does search based on the input in editext at the top of the list. Based on the input comparision is made with data in textview1 of each row and data is filtered and displayed accordingly.

    You can have other items in listview row and the search can be based on texview1/textview2 or textview3. Modify the below according to your needs.

    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 to inflate

    <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 class

     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 讨论(0)
  • 2020-11-27 08:38

    create some array list for the listview ..And on "AddTextChangeListener" you can search for similar items in the list and load a new arraylist for the searched text...

    edittext.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
         //search for the keyword and add the items to a new arraylist
    }
    
    0 讨论(0)
  • 2020-11-27 08:42

    follow the link

    http://marakana.com/forums/android/learning_android_book/617.html

    http://androidsearchfilterlistview.blogspot.in/2011/06/android-custom-list-view-filter.html

    How can I filter ListView data when typing on EditText in android

    How to dynamically update a ListView on Android

    0 讨论(0)
提交回复
热议问题