在适配器中添加addTextChangedListener的问题

时间:2015-03-27 09:30:03

标签: android android-adapter

我正在尝试在我的应用程序中实现搜索功能。我使用了一个适配器,因为我想在listview中显示2个textviews,listview应该是可点击的(我不认为没有适配器就可以这样做。)

我的问题是我无法在适配器类中使用addTextChangedListener。它给出了异常(它在我的活动类中有效)。

搜索activity.java

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_results_activity);

new SearchMenuAsyncTask(getApplicationContext(), this).execute();

listtv = (LinearLayout) findViewById(R.id.product_lv);

lv = (ListView) findViewById(R.id.list_view);
inputSearch = (EditText) findViewById(R.id.inputSearch);

inputSearch.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        System.out.println("Text ["+s+"]");

        adapter.getFilter().filter(s.toString());                           
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

}

@覆盖 public void onTaskCompleted(JSONArray responseJson){

try {

    final List<String> descriptions = new ArrayList<String>();
    final List<String> menudescriptions = new ArrayList<String>();

    for (int i = 0; i < responseJson.length(); ++i) {
        final JSONObject object = responseJson.getJSONObject(i);

        if ((object.getString("MainCategoryID")).equals("5")
                && (object.getString("SubCategoryID")).equals("6")
                && (object.getString("Visible")).equals("true")) {
            Log.i("descriptionsBev ", object.getString("Description"));
            descriptions.add(object.getString("Description"));
            Log.i("MenuDescription ",
                    object.getString("MenuDescription"));
            menudescriptions
                    .add(object.getString("MenuDescription"));

        }

        adapter = new CustomListSearch(
                getApplicationContext(), descriptions,
                menudescriptions);
        lv.setAdapter(adapter);

    }
} catch (JSONException e) {
    e.printStackTrace();
}

}

CustomListSearch.java

    public class CustomListSearch extends BaseAdapter implements Filterable {

    private Context context;
    private final List<String> descriptions;
    private List<String>filteredData = null;
    private final List<String> menudescriptions;
    private ItemFilter mFilter = new ItemFilter();
    private LayoutInflater mInflater;
    ArrayAdapter<String> adapter;

    public CustomListSearch(Context c, List<String> data,
            List<String> menudescriptions) {
        this.context = c;
        this.filteredData = data ;
        this.descriptions = data;
        this.menudescriptions = menudescriptions;
        mInflater = LayoutInflater.from(context);
    }

    @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;
    }

    private class ViewHolder {
        private TextView tvMenudescriptions;
        private TextView tvDescriptions;
    }

    @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.search_list_item, parent, false);

            holder.tvDescriptions = (TextView) convertView
                    .findViewById(R.id.product_name);
            holder.tvMenudescriptions = (TextView) convertView
                    .findViewById(R.id.product_description);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvDescriptions.setText(descriptions.get(position));
        holder.tvMenudescriptions.setText(menudescriptions.get(position));

        LinearLayout itemlist = (LinearLayout) convertView
                .findViewById(R.id.product_lv);
        itemlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "Still under constructions...",
                        Toast.LENGTH_LONG).show();
            }
        });

        return convertView;
    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        return mFilter;
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();

            FilterResults results = new FilterResults();

            final List<String> list = descriptions;

            int count = list.size();
            final ArrayList<String> nlist = new ArrayList<String>(count);

            String filterableString ;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i);
                if (filterableString.toLowerCase().contains(filterString)) {
                    nlist.add(filterableString);
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredData = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }

    }
}

我正在按照以下答案进行操作

Custom Listview Adapter with filter Android

0 个答案:

没有答案