Настраиваемый расширяемый список с дочерним фильтром поиска - PullRequest
1 голос
/ 25 апреля 2011

Я уже реализовал представление списка с помощью фильтра поиска, но сейчас мне нужно изменить его на расширяемое представление списка с фильтром дочернего поиска. Там будет редактировать текст в виде строки поиска и фильтрует все дочерние элементы всех групп. Это сценарий,

* Персона - объект состоит из имени, адреса, номера телефона и фотографии.

Группа 1 - Друзья (Ребенок 1 - Человек, Ребенок 2 - Человек, Ребенок 3 - Человек)

Группа 2 - Семья (ребенок 1 - человек, ребенок 2 - человек)

Группа 3 - Офисные партнеры (Ребенок 1 - Человек, Ребенок 2 - Человек, Ребенок 3 - Человек, Ребенок 4 - Человек)

На данный момент я должен портировать с адаптера массива на базовый расширяемый адаптер списка и фильтровать. Может кто-то помочь мне с этим? Спасибо.

1 Ответ

7 голосов
/ 29 июня 2011
edit = (EditText)findViewById(R.id.editText1);
edit.addTextChangedListener(filterTextWatcher);

private TextWatcher filterTextWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {  

    } 

    public void onTextChanged(CharSequence s, int start, int before, int count) {  

    }

    public void afterTextChanged(Editable s) {
        ((Filterable) ((ListAdapter) Adapter)).getFilter().filter(edit.getText().toString());
    }  
};

public class ListAdapter extends BaseExpandableListAdapter  implements Filterable {
    public void notifyDataSetInvalidated() {
        super.notifyDataSetInvalidated();
    }

    public Filter getFilter() {
        if (filter == null)
            filter = new MangaNameFilter();
            return filter;
        }

private class MangaNameFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // NOTE: this function is *always* called from a background thread, and
        // not the UI thread.
        constraint = edit.getText().toString().toLowerCase();
        FilterResults result = new FilterResults();
        if(constraint != null && constraint.toString().length() > 0) {
            detailsList = detailsSer.GetAlldetails();
            dupCatList = detailsList;

            ArrayList<detailsEntity> filt = new ArrayList<detailsEntity>();
            ArrayList<detailsEntity> lItems = new ArrayList<detailsEntity>();
            synchronized(this) {
                lItems.addAll(dupCatList);
            }

            for(int i = 0, l = lItems.size(); i < l; i++) {
                detailsEntity m = lItems.get(i);

                if (m.description.toLowerCase().contains(constraint))
                    filt.add(m);
                }

                result.count = filt.size();
                result.values = filt;
            } else {
                detailsList = detailsSer.GetAlldetails();
                dupCatList = detailsList;
                synchronized(this) {
                    result.count = dupCatList.size();
                    result.values = dupCatList;
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults result) {
            // NOTE: this function is *always* called from the UI thread.

            filtered = (ArrayList<detailsEntity>)result.values;

            ArrayList<Integer> IdList = new ArrayList<Integer>();
            IdList.clear();
            for(int i = 0; i < filtered.size(); i++) {
                IdList.add(filtered.get(i).catID);
            }

            HashSet<Integer> hashSet = new HashSet<Integer>(IdList);
            midList = new ArrayList<Integer>(hashSet) ;
            Collections.sort(midList);
            Adapter = new CategoryListAdapter(context, R.layout.list1, R.layout.list2, filtered, midList);
            List.setAdapter(Adapter);
        }
    }                   
}
...