Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
#1

Android, метод getFilter(), интерфейса Filterable, в Fragment - Программирование Android

07.11.2015, 12:22. Просмотров 393. Ответов 7
Метки нет (Все метки)

Ситуация такая, использую Filterable, во время поиска, сначала использовал Activity, но затем понадобилось использовать фрагмент. Не буду вдаваться в структуру кода, но вызов метода происходит в кастомном адаптере.

Java
1
2
3
4
 @Override
public Filter getFilter() {
    return ((MainActivity) mContext).new ListFilter();
}
Вот этот код расположен в адаптере, когда использую Activity, но если я использую фрагмент, то не могу понять как мне переделать этот метод, чтобы он корректно работал. А да, ListFilter() это inner класс, который наследуется от Filter. Как мне реализовать подобный метод в фрагменте?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2015, 12:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Android, метод getFilter(), интерфейса Filterable, в Fragment (Программирование Android):

Android fragment + recyclerView - Программирование Android
Всем привет, помогите написать простой пример такой программы: Есть 1 активность (при запуске на ней отображен фрагмент1, в котором...

ClassNotFoundException. android.view.fragment. как лечить? - Программирование Android
Добрый день всем. Есть очень банальная проблема. ClassNotFoundException лейаут popup.xml <?xml version="1.0" encoding="utf-8"?> ...

Как запустить метод Fragment из MainActivity? - Программирование Android
есть фрагмент с картой, в нем метод: public void Sputnik(GoogleMap map) { ...

Обновление fragment из другого fragment - Программирование Android
Добрый вечер всем!! Подскажите пожалуйста как обновить один фрагмент из другого (а именно TextView и ArrayAdapter)?

Filterable не понимаю как в адаптере взять String значение по позиции ? - Программирование Android
fragment: inputSearch.addTextChangedListener(new TextWatcher() { @Override public void...

Android Studio подсвечивает красным метод setText - Программирование Android
Здравствуйте. Я начинающий, пока разбираю простейшие примеры из сети. Вот один из них - из java нужно изменить текст в макете: 1....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
07.11.2015, 17:08 #2
Попробуй вместо mContext написать getActivity()
0
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
07.11.2015, 17:36  [ТС] #3
не оригинально, естественно это первое что я попробывал
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
07.11.2015, 17:59 #4
Цитата Сообщение от DemD10 Посмотреть сообщение
не оригинально
Удивить тебя никто и не хотел)) Я сам тупанул. это же не фрагмент у тебя, а адаптер.

Задача, как я понял, передать ссылку на MainActivity в адаптер. Покажи адаптер и класс в котором его создаешь.
0
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
07.11.2015, 21:54  [ТС] #5
Немного не так, в кратце проблему можно так описать, данный метод прекрасно работает если класс Filter расположен в Активити и не работает если класс фильтер расположен во фрагменте.

Error185, 31) error: incompatible types: Context cannot be converted to FragmentSpeciality

Как бэ ясно что за ошибка, но блин, с этими контекстами беда какая-то.
0
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
08.11.2015, 14:37  [ТС] #6
Ситуация такая, использую Filterable, во время поиска, сначала использовал Activity, но затем понадобилось использовать фрагмент. Не буду вдаваться в структуру кода, но вызов метода происходит в кастомном адаптере.

Adapter

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
public class PinnedHeaderAdapter extends BaseAdapter implements OnScrollListener, IPinnedHeader,Filterable {
 
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SECTION = 1;
 
    private static final int TYPE_MAX_COUNT = TYPE_SECTION + 1;
 
    LayoutInflater mLayoutInflater;
    int mCurrentSectionPosition = 0, mNextSectionPostion = 0;
 
    ArrayList<Integer> mListSectionPos;
 
    ArrayList<String> mListItems;
    ArrayList<String> minfoItems;
    Context mContext;
    private int i = 0;
 
    public PinnedHeaderAdapter(Context context, ArrayList<String> listItems,ArrayList<String> infoItems,ArrayList<Integer> listSectionPos) {
        this.mContext = context;
        this.mListItems = listItems;
        this.mListSectionPos = listSectionPos;
        this.minfoItems = infoItems;
 
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount() {
        return mListItems.size();
    }
 
    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }
 
    @Override
    public boolean isEnabled(int position) {
        return !mListSectionPos.contains(position);
    }
 
    @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }
 
    @Override
    public int getItemViewType(int position) {
        return mListSectionPos.contains(position) ? TYPE_SECTION : TYPE_ITEM;
    }
 
    @Override
    public Object getItem(int position) {
        return mListItems.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return mListItems.get(position).hashCode();
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            int type = getItemViewType(position);
 
            switch (type) {
            case TYPE_ITEM:
                convertView = mLayoutInflater.inflate(R.layout.row_view, null);
                break;
            case TYPE_SECTION:
                convertView = mLayoutInflater.inflate(R.layout.section_row_view, null);
                break;
            }
            holder.name = (TextView) convertView.findViewById(R.id.row_title);
            holder.info = (TextView) convertView.findViewById(R.id.row_info);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
 
        holder.name.setText(mListItems.get(position).toString());
 
        int type = getItemViewType(position);
 
        switch (type) {
            case TYPE_ITEM:
                holder.info.setText(minfoItems.get(i).toString());
                i = i + 1;
                break;
 
        }
 
        return convertView;
    }
 
    @Override
    public int getPinnedHeaderState(int position) {
        // hide pinned header when items count is zero OR position is less than
        // zero OR
        // there is already a header in list view
        if (getCount() == 0 || position < 0 || mListSectionPos.indexOf(position) != -1) {
            return PINNED_HEADER_GONE;
        }
 
        // the header should get pushed up if the top item shown
        // is the last item in a section for a particular letter.
        mCurrentSectionPosition = getCurrentSectionPosition(position);
        mNextSectionPostion = getNextSectionPosition(mCurrentSectionPosition);
        if (mNextSectionPostion != -1 && position == mNextSectionPostion - 1) {
            return PINNED_HEADER_PUSHED_UP;
        }
 
        return PINNED_HEADER_VISIBLE;
    }
 
    public int getCurrentSectionPosition(int position) {
        String listChar = mListItems.get(position).toString().substring(0, 1).toUpperCase(Locale.getDefault());
        return mListItems.indexOf(listChar);
    }
 
    public int getNextSectionPosition(int currentSectionPosition) {
        int index = mListSectionPos.indexOf(currentSectionPosition);
        if ((index + 1) < mListSectionPos.size()) {
            return mListSectionPos.get(index + 1);
        }
        return mListSectionPos.get(index);
    }
 
    @Override
    public void configurePinnedHeader(View v, int position) {
        // set text in pinned header
        TextView header = (TextView) v;
        mCurrentSectionPosition = getCurrentSectionPosition(position);
        header.setText(mListItems.get(mCurrentSectionPosition));
    }
 
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
        if (view instanceof PinnedHeaderListView) {
            ((PinnedHeaderListView) view).configureHeaderView(firstVisibleItem);
        }
    }
 
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public Filter getFilter() {
 
        return ((FragmentSpeciality) mContext).new ListFilter();
    }
 
    public static class ViewHolder {
        public TextView name;
        public TextView info;
    }
 
}
Fragment class

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 public class ListFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // NOTE: this function is *always* called from a background thread,
            // and
            // not the UI thread.
            String constraintStr = constraint.toString().toLowerCase(Locale.getDefault());
            FilterResults result = new FilterResults();
 
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<String> filterItems = new ArrayList<String>();
 
                synchronized (this) {
                    for (String item : mItems) {
                        if (item.toLowerCase(Locale.getDefault()).startsWith(constraintStr)) {
                            filterItems.add(item);
                        }
                    }
                    result.count = filterItems.size();
                    result.values = filterItems;
                }
            } else {
                synchronized (this) {
                    result.count = mItems.size();
                    result.values = mItems;
                }
            }
            return result;
        }
 
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            ArrayList<String> filtered = (ArrayList<String>) results.values;
            setIndexBarViewVisibility(constraint.toString());
            // sort array and extract sections in background Thread
            new Poplulate().execute(filtered);
        }
 
    }
Показал только часть кода фрагмента, то есть inner class. Проблемный метод :

Java
1
2
3
4
5
@Override
    public Filter getFilter() {
 
        return ((FragmentSpeciality) mContext).new ListFilter();
    }
Думаю, проблема с контекстом, но подставлять его по разному пробовал, помогите пожалуйста.
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
08.11.2015, 16:47 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
DemD10, там вообще не контекст нужен.
Передай в конструктор адаптера ссылку на класс в котором описан ListFilter(У тебя это FragmentSpeciality)

Java
1
2
3
4
5
FragmentSpeciality fs;
 
public PinnedHeaderAdapter(FragmentSpeciality fs, Context context, ArrayList<String> listItems,ArrayList<String> infoItems,ArrayList<Integer> listSectionPos) {
this.fs = fs;
...}
Ну и потом измени свой метод
Java
1
2
3
4
5
@Override
    public Filter getFilter() {
 
        return fs.new ListFilter();
    }
1
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
08.11.2015, 17:45  [ТС] #8
Ну вот я сам к этому пришел), но все равно спасибо за отзывчивость.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2015, 17:45
Привет! Вот еще темы с ответами:

Метод с generic параметром, реализующий метод интерфейса - C#
Здравствуйте, подскажите почему ругается компилятор, что метод Add интерфейса IElementSystem не реализован? Я ведь указал, что T реализует...

Спрятать метод интерфейса - C#
Ребята. Реализую интерфейс, в котором определён метод volume(объём). Хочу, чтобы этот метод был не доступен вне этого класса. Реализую его...

Не работает метод интерфейса callback - C# WCF
у меня есть &quot;чат&quot;,например 2 пользователя конектяться и становятся онлайн, 2-ой пользователь хочет создать приватную комнату с 1-ым, он...

Переопределить метод интерфейса Comparable для подкласса - Java SE
Медленными шагами развиваюсь по книге Хорстмана и Корнелла, наткнулся на такую проблему: У меня есть следующие классы: Pet import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.11.2015, 17:45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru