我有一个应用程序,其中将json中的数据显示到listview中,现在想在listview上应用搜索功能。但是每当我在editbox中输入内容时,错误数组索引就会超出界限。请帮助我进行排序。
HomeActivity
public class HomeActivity extends Fragment { String countryCode; ArrayList<ProfileBean> catagery; EditText search; AdaptorClass adapter; public static String Bussinessurl; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //setContentView(R.layout.homeactivity); View rootView = inflater.inflate(R.layout.homeactivity, container, false); //Log.i("homeurl", "http://chabu.agicent.com/api/v1/get_business?token=" +Login.USERTOKEN.toString()); search=(EditText)rootView.findViewById(R.id.search); catagery = new ArrayList<ProfileBean>(); new JSONAsyncTask() .execute(Login.AllChabu); ListView listview = (ListView)rootView. findViewById(R.id.list); adapter = new AdaptorClass(getActivity(), R.layout.row, catagery); listview.setItemsCanFocus(false); //listview.setOnItemClickListener(this); listview.setTextFilterEnabled(true); listview.setAdapter(adapter); countryCode = GetCountryZipCode(); Log.i("country code", countryCode); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { // TODO Auto-generated method stub //Toast.makeText(getActivity(), // catagery.get(position).getcategory_name(), Toast.LENGTH_LONG) //.show(); position = position+1; Log.i("url", Bussinessurl); Intent i= new Intent( getActivity(), BusinessActivity.class); startActivity(i); } }); search.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub search.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { adapter.getFilter().filter(s.toString()); } }); } }); return rootView; }
适配器类
public class AdaptorClass extends ArrayAdapter<ProfileBean> implements Filterable { private List<ProfileBean> originalData = null; private List<ProfileBean> filteredData = null; LayoutInflater vi; int Resource; ViewHolder holder; private ItemFilter mFilter = new ItemFilter(); public AdaptorClass(Context context, int resource, ArrayList<ProfileBean> objects) { super(context, resource, objects); vi = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); Resource = resource; //actorList = objects; this.filteredData = objects; this.originalData = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { holder = new ViewHolder(); v = vi.inflate(Resource, null); holder.tvDescription = (TextView) v .findViewById(R.id.tvDescriptionn); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } holder.tvDescription .setText(filteredData.get(position).getcategory_name()); return v; } static class ViewHolder { public TextView tvDescription; } public android.widget.Filter getFilter() { return mFilter; } private class ItemFilter extends android.widget.Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { String filterString = constraint.toString().toLowerCase(); FilterResults results = new FilterResults(); final List<ProfileBean> list = originalData; int count = list.size(); Log.i("count", String.valueOf(count)); final ArrayList<ProfileBean> nlist = new ArrayList<ProfileBean>(count); String filterableString; for (int i = 0; i <count; i++) { ProfileBean bean = list.get(i); filterableString = bean.getcategory_name(); if (filterableString.toLowerCase().contains( filterString.toString().toLowerCase())) { nlist.add(bean); } } results.values = nlist; results.count = nlist.size(); return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredData = (ArrayList<ProfileBean>) results.values; notifyDataSetChanged(); } }
尝试这种方式,希望这将帮助您解决问题。
Home Fragment
public class HomeActivity extends Fragment { String countryCode; ArrayList<ProfileBean> catagery; EditText search; AdaptorClass adapter; public static String Bussinessurl; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View rootView = inflater.inflate(R.layout.homeactivity, container, false); //Log.i("homeurl", "http://chabu.agicent.com/api/v1/get_business?token=" +Login.USERTOKEN.toString()); search = (EditText) rootView.findViewById(R.id.search); catagery = new ArrayList<ProfileBean>(); new JSONAsyncTask() .execute(Login.AllChabu); ListView listview = (ListView) rootView.findViewById(R.id.list); adapter = new AdaptorClass(getActivity(), catagery); listview.setItemsCanFocus(false); listview.setTextFilterEnabled(true); listview.setAdapter(adapter); countryCode = GetCountryZipCode(); Log.i("country code", countryCode); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { //Toast.makeText(getActivity(), // catagery.get(position).getcategory_name(), Toast.LENGTH_LONG) //.show(); position = position + 1; Log.i("url", Bussinessurl); Intent i = new Intent(getActivity(), BusinessActivity.class); startActivity(i); } }); search.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { String text = search.getText().toString(); adapter.filter(text); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) { } }); return rootView; } }
转接器类别
public class AdaptorClass extends BaseAdapter { private List<ProfileBean> originalData; private List<ProfileBean> filteredData; private Context context; public AdaptorClass(Context context,ArrayList<ProfileBean> originalData) { this.context=context; this.originalData = originalData; filteredData =new List<ProfileBean>(); filteredData.addAll(this.originalData); } @Override public int getCount() { return filteredData.size(); } @Override public Object getItem(int position) { return filteredData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.row, null); holder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescriptionn); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvDescription.setText(filteredData.get(position).getcategory_name()); return convertView; } class ViewHolder { public TextView tvDescription; } public void filter(String charText) { filteredData.clear(); if (charText.length() == 0) { filteredData.addAll(originalData); } else { for (ProfileBean bean : originalData) { if (bean.getcategory_name().toLowerCase().contains(charText.toLowerCase())) { filteredData.add(bean); } } } notifyDataSetChanged(); } }