¿Cómo implementar autocompletetextview con listview?

Recibo una respuesta del servidor y la visualizo usando listview y funciona bien, ahora lo que bash es agregar autocompletetextview para buscar elementos por nombre, pero cuando ejecuto mi aplicación, se bloquea y muestra errores. Ya pregunto esto


public class Tab1Activity extends ListActivity{ private ProgressDialog pDialog; JSONArray Product=null; private ListView listview; ArrayList<HashMap> aList; ArrayList<HashMap> arrayTemplist; private static String PRODUCT_URL = ""; private static final String PRODUCT_DATA="Product"; private static final String PRODUCT_ID="productid"; private static final String PRODUCT_NAME="product_name"; private static final String PRODUCT_CODE="skucode"; private static final String PRODUCT_IMAGE="product_photo"; private static final String PRODUCT_WEIGHT="weight"; private static final String PRODUCT_SALERATE="sale_rate"; //private static final String PRODUCT_LOCATION="weight"; private CustomAdapterTabone adapter; private TextView noacpt; private AutoCompleteTextView inputSearch; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.list_view_tabone); //noacpt=(TextView)findViewById(R.id.no_acceptedlist); /*String strtext = getIntent().getStringExtra("id"); System.out.println("<<<<<<<< id : " + strtext);*/ final ListView listview = (ListView)findViewById(android.R.id.list); //listview.setSelector( R.drawable.list_selector); //listview.setSelector(R.drawable.listselector); new LoadAlbums().execute(); aList = new ArrayList<HashMap>(); final ListView lv = getListView(); inputSearch = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { arrayTemplist= new ArrayList<HashMap>(); String searchString =inputSearch.getText().toString().toLowerCase(); for (int i = 0; i < aList.size(); i++) { String currentString =aList.get(i).get(Tab1Activity.PRODUCT_NAME); if (currentString.toLowerCase().startsWith(searchString )) { arrayTemplist.add(aList.get(i)); } } for (int i = 0; i < arrayTemplist.size(); i++) { String currentstrin = arrayTemplist.get(i).get(Tab1Activity.PRODUCT_NAME); //Toast.makeText(getApplicationContext(), currentstrin, Toast.LENGTH_LONG).show(); } adapter=new CustomAdapterTabone(getApplicationContext(), arrayTemplist); listview.setAdapter(adapter); /* SimpleAdapter adapters = new SimpleAdapter(Tab1Activity.this, arrayTemplist,R.layout.list_item_tabone, new String[] { PRODUCT_NAME }, new int[] { R.id.txtpronameacptedlist}); lv.setAdapter(adapters); */ } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } }); } @Override public void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(getApplicationContext(), AllProductDetails.class); intent.putExtra("productid", aList.get(position).get(PRODUCT_ID)); startActivity(intent); } class LoadAlbums extends AsyncTask<String, String, ArrayList<HashMap>> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(Tab1Activity.this); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(true); // pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress)); pDialog.setCancelable(false); pDialog.show(); } protected ArrayList<HashMap> doInBackground(String... args) { ServiceHandler sh = new ServiceHandler(); // Making a request to url and getting response ArrayList<HashMap> data = new ArrayList<HashMap>(); String jsonStr = sh.makeServiceCall(PRODUCT_URL, ServiceHandler.GET); Log.d("Response: ", "> " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node Product = jsonObj.getJSONArray(PRODUCT_DATA); for (int i = 0; i < Product.length(); i++) { JSONObject c = Product.getJSONObject(i); // creating new HashMap HashMap map = new HashMap(); // adding each child node to HashMap key => value map.put(PRODUCT_ID, c.getString(PRODUCT_ID)); map.put(PRODUCT_NAME,c.getString(PRODUCT_NAME)); map.put(PRODUCT_CODE, c.getString(PRODUCT_CODE)); map.put(PRODUCT_IMAGE, c.getString(PRODUCT_IMAGE)); map.put(PRODUCT_WEIGHT, c.getString(PRODUCT_WEIGHT)); map.put(PRODUCT_SALERATE, c.getString(PRODUCT_SALERATE)+getResources().getString(R.string.rupee)); // map.put(INTEREST_ACCEPT_LOCATION, c.getString(INTEREST_ACCEPT_LOCATION)); // adding HashList to ArrayList data.add(map); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("ServiceHandler", "Couldn't get any data from the url"); } return data; } protected void onPostExecute(ArrayList<HashMap> result) { super.onPostExecute(result); // dismiss the dialog after getting all albums if (pDialog.isShowing()) pDialog.dismiss(); // updating UI from Background Thread aList = new ArrayList<HashMap>(); aList.addAll(result); adapter = new CustomAdapterTabone(getApplicationContext(),result); setListAdapter(adapter); aList.addAll(result); adapter.notifyDataSetChanged(); } 



  public class CustomAdapterTabone extends BaseAdapter{ private Context context; private ArrayList<HashMap> listData; private AQuery aQuery; private static final String TAG_NAME="product_name"; private static final String TAG_PROFILE="skucode"; private static final String TAG_IMAGE="product_photo"; private static final String TAG_CAST="weight"; private static final String TAG_AGE="sale_rate"; // private static final String TAG_LOCATION="weight"; public CustomAdapterTabone(Context context,ArrayList<HashMap> listData) { this.context = context; this.listData=listData; aQuery = new AQuery(this.context); } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.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_tabone, null); holder.propic = (ImageView) convertView.findViewById(R.id.propicaccept); holder.txtproname = (TextView) convertView.findViewById(R.id.txtpronameacptedlist); holder.txtproid = (TextView) convertView.findViewById(R.id.txtproidacptedlist); holder.txtprofilecast = (TextView) convertView.findViewById(R.id.txtprofilecastacptedlist); holder.txtprofileage = (TextView) convertView.findViewById(R.id.txtprofileageacptedlist); // holder.txtprofileplace = (TextView) convertView.findViewById(R.id.txtprofileplaceacptedlist); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.txtproname.setText(listData.get(position).get(TAG_NAME)); holder.txtproid.setText(listData.get(position).get(TAG_PROFILE)); holder.txtprofilecast.setText(listData.get(position).get(TAG_CAST)); holder.txtprofileage.setText(listData.get(position).get(TAG_AGE)); //holder.txtprofileplace.setText(listData.get(position).get(TAG_LOCATION)); aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE),true,true,0,R.drawable.ic_launcher); // image parameter : 1 : memory cache,2:file cache,3:target width,4:fallback image return convertView; } class ViewHolder{ ImageView propic; TextView txtproname; TextView txtproid; TextView txtprofilecast; TextView txtprofileage; TextView txtprofileplace; } } 

Primero crea un adaptador personalizado implementa filtrable:

 public class MyFilterableAdapter extends BaseAdapter implements Filterable { private Context context; private List items; private List filteredItems; private ItemFilter mFilter = new ItemFilter(); public MyFilterableAdapter(Context context, List items) { //super(context, R.layout.your_row, items); this.context = context; this.items = items; this.filteredItems = items; } @Override public int getCount() { return filteredItems.size(); } @Override public Object getItem(int position) { return filteredItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.row_search_merchant, parent, false); viewHolder = new ViewHolder(); viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String location = filteredItems.get(position); if (!location.isEmpty() || viewHolder != null) { viewHolder.tvTitle.setText(location); } return convertView; } public static class ViewHolder { TextView tvTitle; } private class ItemFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { String filterString = constraint.toString().toLowerCase(); FilterResults results = new FilterResults(); int count = items.size(); final List tempItems = new ArrayList<>(count); for (int i = 0; i < count; i++) { if (items.get(i).toLowerCase().contains(filterString)) { tempItems.add(items.get(i)); } } results.values = tempItems; results.count = tempItems.size(); return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredItems = (ArrayList) results.values; notifyDataSetChanged(); } } public Filter getFilter() { return mFilter; } } 

Y que crear un textwatcher

 public class MyTextWatcher implements TextWatcher { private MyCustomAdapter lAdapter; public MyTextWatcher(MyCustomAdapter lAdapter) { this.lAdapter = lAdapter; } @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) { lAdapter.getFilter().filter(s.toString().toLowerCase()); } } 

Y finalmente agregue su TextWatcher a su texto de búsqueda de edición:

 final MyCustomAdapter lAdapter = new MyCustomAdapter(context, items); EditText etSearch = (EditText) view.findViewById(R.id.et_search); etSearch.addTextChangedListener(new SearchTextWatcher(lAdapter)); 

Espero que esto te ayude