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

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

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

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

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

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

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

findViewById и Fragment Android
Android OnActivityResult For Fragment
Android Работа с Fragment
Android Обновление fragment из другого fragment
Android Reload Fragment
Android TextView and Fragment
Fragment Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
07.11.2015, 17:08     Android, метод getFilter(), интерфейса Filterable, в Fragment #2
Попробуй вместо mContext написать getActivity()
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 433
07.11.2015, 17:36  [ТС]     Android, метод getFilter(), интерфейса Filterable, в Fragment #3
не оригинально, естественно это первое что я попробывал
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
07.11.2015, 17:59     Android, метод getFilter(), интерфейса Filterable, в Fragment #4
Цитата Сообщение от DemD10 Посмотреть сообщение
не оригинально
Удивить тебя никто и не хотел)) Я сам тупанул. это же не фрагмент у тебя, а адаптер.

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

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

Как бэ ясно что за ошибка, но блин, с этими контекстами беда какая-то.
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 433
08.11.2015, 14:37  [ТС]     Android, метод getFilter(), интерфейса Filterable, в Fragment #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();
    }
Думаю, проблема с контекстом, но подставлять его по разному пробовал, помогите пожалуйста.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
08.11.2015, 16:47     Android, метод getFilter(), интерфейса Filterable, в Fragment #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();
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2015, 17:45     Android, метод getFilter(), интерфейса Filterable, в Fragment
Еще ссылки по теме:

Android Как запустить метод Fragment из MainActivity?
Android Filterable не понимаю как в адаптере взять String значение по позиции ?
Android ClassNotFoundException. android.view.fragment. как лечить?
Fragment и RoboSpice Android
Android Android fragment + recyclerView

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

Или воспользуйтесь поиском по форуму:
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 433
08.11.2015, 17:45  [ТС]     Android, метод getFilter(), интерфейса Filterable, в Fragment #8
Ну вот я сам к этому пришел), но все равно спасибо за отзывчивость.
Yandex
Объявления
08.11.2015, 17:45     Android, метод getFilter(), интерфейса Filterable, в Fragment
Ответ Создать тему
Опции темы

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