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

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

16.06.2016, 11:29. Показов 1539. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru