Search code examples
androidautocompletesearchview

How can i add auto searchview with listview?


I am new to android,I have Listview in which i added image and simple text now i want to put search view or autocomplete text view facility,whenever user search for item user can get items as per enter the text.

public class Actors extends Activity implements OnItemClickListener{

public static final String[] sightstitle = new String[] { "Ghoghla Beach Diu","Jallandhar Shrine", "Hoka Trees Diu","INS Khukhri Diu","Nagoa Beach Diu","Panikotha-Fortim Do Mar"};
public static final Integer[] sightimages = { R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};
public static final Integer[] sightimagearow = {R.drawable.arrow,R.drawable.arrow,R.drawable.arrow,R.drawable.arrow,R.drawable.arrow,R.drawable.arrow };


ListView listView;
List<RowItem> rowItems;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_view_mainmenu);

    rowItems = new ArrayList<RowItem>();
    for (int i = 0; i < sightstitle.length; i++) {
        RowItem item = new RowItem(sightimages[i], sightstitle[i],sightimagearow[i]);
        rowItems.add(item);
    }

    listView = (ListView) findViewById(R.id.list);
    CustomBaseAdapter adapter = new CustomBaseAdapter(this, rowItems);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
        "Item " + (position + 1) + ": " + rowItems.get(position),
        Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();


}
}

public class CustomBaseAdapter extends BaseAdapter{

Context context;
List<RowItem> rowItems;

public CustomBaseAdapter(Context context, List<RowItem> items) {
    this.context = context;
    this.rowItems = items;
}

/*private view holder class*/
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
    //TextView txtDesc;
    ImageView imgarrow;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater)
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item_main_menu, null);
        holder = new ViewHolder();
        //holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.img);
        holder.imgarrow=(ImageView)convertView.findViewById(R.id.sight_arrow_icon);
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }

    RowItem rowItem = (RowItem) getItem(position);

    //holder.txtDesc.setText(rowItem.getDesc());
    holder.txtTitle.setText(rowItem.getTitle());
    holder.imageView.setImageResource(rowItem.getImageId());
    holder.imgarrow.setImageResource(rowItem.getImg());

    return convertView;
}

@Override
public int getCount() {    
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}
}

output of my example


Solution

  • Add filter method your ActorsListAdapter and pass input value to filter method :

    public class CustomBaseAdapter extends BaseAdapter {
        private Context context;
        private List<RowItem> filterData;
        private List<RowItem> listData;
    
    
        public CustomBaseAdapter(Context context,List<RowItem> listData) {
            this.context = context;
            this.listData=listData;
            filterData = new ArrayList<RowItem>();
            filterData.addAll(listData);
        }
    
        @Override
        public int getCount() {
            return filterData.size();
        }
    
        @Override
        public Object getItem(int position) {
            return filterData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item_main_menu, null);
                holder.imageView = (ImageView) convertView.findViewById(R.id.img);
                holder.imgarrow = (ImageView) convertView.findViewById(R.id.sight_arrow_icon);
                holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
    
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }
    
            holder.txtTitle.setText(filterData.get(position).getTitle());
            holder.imageView.setImageResource(listData.get(position).getImageId());
            holder.imgarrow.setImageResource(listData.get(position).getImg());
    
            return convertView;
        }
    
        public void filter(String charText) {
            filterData.clear();
            if (charText.length() == 0) {
                filterData.addAll(listData);
            }else{
                for (RowItem rowItem: listData) {
                    if (rowItem.getTitle().toLowerCase().startsWith(charText.toString().toLowerCase()))
                        filterData.add(rowItem);
                }
            }
            notifyDataSetChanged();
        }
    
    
        class ViewHolder{
            ImageView imageView;
            ImageView imgarrow;
            TextView txtTitle;
        }
    }
    

    How to apply filter :

    et.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
           adapter.filter(s.toString().trim())
        }
     });