Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search in ListView with EditText

Tags:

android

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 my ListView by the value in first TextView of each row?

like image 266
itechDroid Avatar asked May 30 '12 12:05

itechDroid


3 Answers

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
}
like image 68
hacker Avatar answered Nov 15 '22 15:11

hacker


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());




 }
}
like image 2
Raghunandan Avatar answered Nov 15 '22 14:11

Raghunandan


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

like image 1
Dheeresh Singh Avatar answered Nov 15 '22 13:11

Dheeresh Singh