Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684

Filterable не понимаю как в адаптере взять String значение по позиции ?

16.06.2016, 11:29. Показов 1561. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
fragment:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence cs, int start, int count, int after) {
                OneFragment.this.adapter.getFilter().filter(cs);
            }
 
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
 
            }
 
            @Override
            public void afterTextChanged(Editable s) {
 
            }
        });


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
public class BoxAdapter extends BaseAdapter implements Filterable {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<Product> objects;
    Product p, pn;
    BoxAdapter(Context context, ArrayList<Product> products) {
        ctx = context;
        objects = products;
        lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    // кол-во элементов
    @Override
    public int getCount() {  return objects.size();}
 
    // элемент по позиции
    @Override
    public Object getItem(int position) { return objects.get(position); }
 
    // id по позиции
    @Override
    public long getItemId(int position) { return position; }
 
    // пункт списка
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.list_item, parent, false);
        }
 
        p = getProduct(position); 
 
        // заполняем View в пункте списка данными из товаров: наименование, цена и картинка
        ((TextView) view.findViewById(R.id.pro_item)).setText(p.name);
        ((TextView) view.findViewById(R.id.pro_item_price)).setText(p.price + "");
        ((TextView) view.findViewById(R.id.textCurs)).setText(p.curs + "");
       // ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
 
//        CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
//        // присваиваем чекбоксу обработчик
//        cbBuy.setOnCheckedChangeListener(myCheckChangList);
//        // пишем позицию
//        cbBuy.setTag(position);
//        // заполняем данными из товаров: в корзине или нет
//        cbBuy.setChecked(p.box);
        return view;
    }
 
    // товар по позиции
   Product getProduct(int position)   { return ((Product) getItem(position)); }
 
    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
 
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
            objects =  (ArrayList<Product>) results.values;
               // arrayListNames = (List<String>) results.values;
                notifyDataSetChanged();
            }
 
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
 
                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();
 
                // perform your search here using the searchConstraint String.
 
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < objects.size(); i++) {
                    String dataNames =  objects.get(i).name;// НЕЗНАЮ ПРАВИЛЬНО ЛИ ТУТ???
                    if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                        FilteredArrayNames.add(dataNames);
                    }
                }
 
                results.count = FilteredArrayNames.size();
                results.values = FilteredArrayNames;
                Log.e("VALUES", results.values.toString());
 
                return results;
            }
        };
 
        return filter;
    }
}


класс Product:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Product {
 
    String  name;
    String     price;
    String     curs;
    int     image;
    boolean box;
 
    //Product(String _describe, String _price, int _image, boolean _box) {
    Product(String _describe, String _price, String _curs) {
        name = _describe;
        price = _price;
        curs = _curs;
//        image = _image;
//        box = _box;
    }
 
}


при вводе символа в EditText сыпется, ругается на эти строки:
Java
1
2
p = getProduct(position); 
Product getProduct(int position)   { return ((Product) getItem(position)); }
с такой ошибкой:
XML
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
FATAL EXCEPTION: main
                                                                      java.lang.ClassCastException: java.lang.String cannot be cast to com.dis.alprice.Product
                                                                          at com.dis.alprice.BoxAdapter.getProduct(BoxAdapter.java:67)
                                                                          at com.dis.alprice.BoxAdapter.getView(BoxAdapter.java:47)
                                                                          at android.widget.AbsListView.obtainView(AbsListView.java:2143)
                                                                          at android.widget.ListView.makeAndAddView(ListView.java:1831)
                                                                          at android.widget.ListView.fillSpecific(ListView.java:1320)
                                                                          at android.widget.ListView.layoutChildren(ListView.java:1630)
                                                                          at android.widget.AbsListView.onLayout(AbsListView.java:1994)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
                                                                          at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
                                                                          at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
                                                                          at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
                                                                          at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
                                                                          at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
                                                                          at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
                                                                          at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
                                                                          at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
                                                                          at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
                                                                          at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                                                          at android.view.View.layout(View.java:14008)
                                                                          at android.view.ViewGroup.layout(ViewGroup.java:4373)
                                                                          at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
                                                                          at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
                                                                          at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
                                                                          at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
                                                                          at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
                                                                          at android.view.Choreographer.doCallbacks(Choreographer.java:562)
                                                                          at android.view.Choreographer.doFrame(Choreographer.java:532)
                                                                          at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
                                                                          at android.os.Handler.handleCallback(Handler.java:725)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                          at android.os.Looper.loop(Looper.java:137)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5041)
                                                                          at java.lang.reflect.Method.invokeNative(Native Method)
                                                                          at java.lang.reflect.Method.invoke(Method.java:511)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                                                                          at dalvik.system.NativeStart.main(Native Method)
что не правильно, может быть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2016, 11:29
Ответы с готовыми решениями:

Как взять значение переменной String из текстового файла?
как взять значение переменной String из текстового файла?

Как взять текст с определенной позиции в текстбокс?
Подскажите пожалуйста как сделать такую штуку: у меня есть файл n.txt мне надо чтобы моя программа могла взять из этого файла строчку № X и...

Как из String взять слово?
У меня есть функция которая принимает 4 переменные типа String. Это ФИО и 4 String это название файла(например: Иванов Иван Иванович.doc)....

13
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
16.06.2016, 12:46
Цитата Сообщение от disx Посмотреть сообщение
beforeTextChanged
? А, случаем, не afterTextChanged?
Java
1
BoxAdapter(Context context, ArrayList<Product> products)
Java
1
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
Нет ли здесь противоречия?
1
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
16.06.2016, 12:50
Java
1
String cannot be cast to com.dis.alprice.Product
ты ж везде класс возвращаешь, а не строку.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
16.06.2016, 13:11  [ТС]
CoolMind,
? А, случаем, не afterTextChanged?
взял из этого примера - ссыль

Нет ли здесь противоречия?
поменял в итоге так:


petruchodd,
Кликните здесь для просмотра всего текста
ты ж везде класс возвращаешь, а не строку.

так и есть, не понимаю как возвратиться строку...
0
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
16.06.2016, 13:38
Не уверен, но как вариант:
Продуктов много, по позиции ты получаешь продукт(обьект)
Добавь в класс продукта функции типа getName getPrice итд и потом вызывай что тебе там нужно
Java
1
public String getPrice(){return price;}

Java
1
TextView.setText("Price: "+p.getPrice());

или price, name сделай public
Java
1
2
publilc String  name;
    public String     price;
тогда в
Java
1
((TextView) view.findViewById(R.id.pro_item)).setText(p.name);
будет срабатывать.
1
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
16.06.2016, 14:26  [ТС]
сделал так заработало:

Java
1
2
3
4
5
6
7
8
9
for (int i = 0; i < objects.size(); i++) {
                    String dataNames =  objects.get(i).name;//
                    if (dataNames.toLowerCase().contains(constraint.toString()))   {
                   // if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                        Log.d("myLogs", dataNames);
                        FilteredArrayNames.add(objects.get(i));
                  
                    }
                }
но остался последний вопрос, когда ввожу символы выводит результат по мере их добавления, а если стираю(Backspase) их то ничего не происходит (в списке остаются только отфильтрованные при вводе результаты), как исправить это можно?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
16.06.2016, 14:59
disx, не пробовали смотреть, что получается в OneFragment.this.adapter.getFilter().fil ter(cs); (в cs)?
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
16.06.2016, 15:39  [ТС]
CoolMind, перекинул эту строку в :

Java
1
2
3
4
5
6
@Override
            public void afterTextChanged(Editable cs) {
            
                OneFragment.this.adapter.getFilter().filter(cs);
                Log.d("myLogs", cs.toString());
            }
теперь стало реагировать на вводимый символ, но когда начинаешь стирать в обратном порядке символы, отфильтрованый результат остается как был:

Java
1
2
3
4
5
6
7
06-16 12:34:32.556 30882-30882/com.dis.alprice D/myLogs: 7
06-16 12:34:33.700 30882-30882/com.dis.alprice D/myLogs: 70
06-16 12:34:35.732 30882-30882/com.dis.alprice D/myLogs: 70u
06-16 12:34:37.480 30882-30882/com.dis.alprice D/myLogs: 70ux
06-16 12:34:38.592 30882-30882/com.dis.alprice D/myLogs: 70u //После того как стер "x" и остальные, в listview список результатов не изменяется.
06-16 12:34:39.688 30882-30882/com.dis.alprice D/myLogs: 70
06-16 12:34:40.288 30882-30882/com.dis.alprice D/myLogs: 7
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
16.06.2016, 18:15
Цитата Сообщение от disx Посмотреть сообщение
когда начинаешь стирать в обратном порядке символы, отфильтрованый результат остается как был
Логи говорят, что вы передаёте корректное значение строки. Значит, внутри фильтра ошибка.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
17.06.2016, 09:19  [ТС]
CoolMind, вот фильтр:
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
 @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                objects = (ArrayList<Product>) results.values;
                notifyDataSetChanged();
            }
 
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
 
                FilterResults results = new FilterResults();
                ArrayList<Product> FilteredArrayNames = new ArrayList<Product>();
 
                // perform your search here using the searchConstraint String.
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < objects.size(); i++) {
                    String dataNames = objects.get(i).name;//
                    if (dataNames.toLowerCase().contains(constraint.toString())) {
                        FilteredArrayNames.add(objects.get(i));
                        // FilteredArrayNames.add(dataNames);
                   }
                }
 
                results.count = FilteredArrayNames.size();
                results.values = FilteredArrayNames;
              //  Log.d("VALUES", results.values.toString());
 
                return results;
            }
        };
 
        return filter;
    }
обновление listview происходит только когда ввожу символы, а когда стираю не обновляется ???
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
17.06.2016, 12:13
disx, с утра как раз вспомнил про эту проблему.
Скорее всего, вы оперируете одной и той же коллекцией объектов, а значит, с течением времени их может становиться только меньше (за счёт фильтрации списка). Вам нужно при фильтрации оперировать исходной коллекцией объектов. Т.е. в конструктор фильтра передавать всю коллекцию, а поиск и фильтрацию делать уже по копии или аккуратно по исходной. Т.е. может произойти дублирование данных. Поищите примеры, мне некогда искать.
1
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
17.06.2016, 21:10  [ТС]
CoolMind, таки да, одной,

Примеров дох.. много, но почти все одинаковые, просто не могу понять как задействуется notifyDataSetChanged когда стираются буквы???
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
18.06.2016, 01:02
Лучший ответ Сообщение было отмечено disx как решение

Решение

Цитата Сообщение от disx Посмотреть сообщение
как задействуется notifyDataSetChanged когда стираются буквы?
Этот метод "говорит" активности, что пора обновить список на экране, если изменился набор данных. Иногда адаптер делает это не сразу, поэтому надо вызывать метод.
С фильтрацией я сначала тоже мучался, у меня тоже была подобная проблема. Есть ещё один способ, там нет вложенного фильтра, адаптер основывается на некой коллекции, которую постоянно меняют по условию. Но ваш способ тоже хорош.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
21.06.2016, 16:07  [ТС]
Но ваш способ тоже хорош.
хорош, но пока до сих пор одноногий..

Добавлено через 23 часа 9 минут
заработало вот таким способом:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        list.clear();
        if (charText.length() == 0) {
            list.addAll(objects);
        }
        else
        {
            for (Product prod : objects)
            {
                if (prod.getName().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    list.add(prod);
                }
            }
        }
        notifyDataSetChanged();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2016, 16:07
Помогаю со студенческими работами здесь

Как вырезать подстроку из строки?
мне нужно чтобы например a:=str(от второго символа до четвертого)

Как из unordered_map<string, string> получить значение по ключу
У меня есть такая штука. Как мне из нее получить значение по ключу? Я вот хочу написать string str = parents и получить...

Не понимаю как взять такое условие: сисус от синуса от синуса... (+)
1. Даны натуральное число N и действительное число X. Вычислить: sin 1*Х +sin sin2*X +sin sin sin 3*X +…+sin sin… sin N*X Сделал вот...

Как достать значение переменных из программы не понимаю
Для расчёта фильтра воспользовался циклом for, а как достать значение переменных не понимаю. кто понимает, что тут не так подскажите! ...

Как из функции взять значение?
Господа! Вот программка &quot;быстрая сортировка&quot; #include &quot;stdlib.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream&gt; // Ввод/Вывод #include...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru