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

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

Войти
Регистрация
Восстановить пароль
 
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
#1

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

16.06.2016, 11:29. Просмотров 304. Ответов 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)
что не правильно, может быть?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2016, 11:29     Filterable не понимаю как в адаптере взять String значение по позиции ?
Посмотрите здесь:
Android, метод getFilter(), интерфейса Filterable, в Fragment Android
Как брать путь картинки в sqlite, и сетить на айтем в адаптере? Android
Android Как получить значение String из UI потока в потоке AsyncTask?
Убить поток в адаптере Android
NullPointerException в адаптере RecyclerView Android
Загрузки изображений из сети в адаптере GridView Android
Android Показывать или скрывать записи в адаптере
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.06.2016, 12:46     Filterable не понимаю как в адаптере взять String значение по позиции ? #2
Цитата Сообщение от disx Посмотреть сообщение
beforeTextChanged
? А, случаем, не afterTextChanged?
Java
1
BoxAdapter(Context context, ArrayList<Product> products)
Java
1
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
Нет ли здесь противоречия?
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
16.06.2016, 12:50     Filterable не понимаю как в адаптере взять String значение по позиции ? #3
Java
1
String cannot be cast to com.dis.alprice.Product
ты ж везде класс возвращаешь, а не строку.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
16.06.2016, 13:11  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #4
CoolMind,
? А, случаем, не afterTextChanged?
взял из этого примера - ссыль

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

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

так и есть, не понимаю как возвратиться строку...
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
16.06.2016, 13:38     Filterable не понимаю как в адаптере взять String значение по позиции ? #5
Не уверен, но как вариант:
Продуктов много, по позиции ты получаешь продукт(обьект)
Добавь в класс продукта функции типа 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);
будет срабатывать.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
16.06.2016, 14:26  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #6
сделал так заработало:

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) их то ничего не происходит (в списке остаются только отфильтрованные при вводе результаты), как исправить это можно?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.06.2016, 14:59     Filterable не понимаю как в адаптере взять String значение по позиции ? #7
disx, не пробовали смотреть, что получается в OneFragment.this.adapter.getFilter().filter(cs); (в cs)?
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
16.06.2016, 15:39  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #8
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
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.06.2016, 18:15     Filterable не понимаю как в адаптере взять String значение по позиции ? #9
Цитата Сообщение от disx Посмотреть сообщение
когда начинаешь стирать в обратном порядке символы, отфильтрованый результат остается как был
Логи говорят, что вы передаёте корректное значение строки. Значит, внутри фильтра ошибка.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
17.06.2016, 09:19  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #10
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 происходит только когда ввожу символы, а когда стираю не обновляется ???
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
17.06.2016, 12:13     Filterable не понимаю как в адаптере взять String значение по позиции ? #11
disx, с утра как раз вспомнил про эту проблему.
Скорее всего, вы оперируете одной и той же коллекцией объектов, а значит, с течением времени их может становиться только меньше (за счёт фильтрации списка). Вам нужно при фильтрации оперировать исходной коллекцией объектов. Т.е. в конструктор фильтра передавать всю коллекцию, а поиск и фильтрацию делать уже по копии или аккуратно по исходной. Т.е. может произойти дублирование данных. Поищите примеры, мне некогда искать.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
17.06.2016, 21:10  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #12
CoolMind, таки да, одной,

Примеров дох.. много, но почти все одинаковые, просто не могу понять как задействуется notifyDataSetChanged когда стираются буквы???
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
18.06.2016, 01:02     Filterable не понимаю как в адаптере взять String значение по позиции ? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от disx Посмотреть сообщение
как задействуется notifyDataSetChanged когда стираются буквы?
Этот метод "говорит" активности, что пора обновить список на экране, если изменился набор данных. Иногда адаптер делает это не сразу, поэтому надо вызывать метод.
С фильтрацией я сначала тоже мучался, у меня тоже была подобная проблема. Есть ещё один способ, там нет вложенного фильтра, адаптер основывается на некой коллекции, которую постоянно меняют по условию. Но ваш способ тоже хорош.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 16:07     Filterable не понимаю как в адаптере взять String значение по позиции ?
Еще ссылки по теме:
Назначить идентификаторы кнопкам в адаптере списка Android
Android Поиск по ListView основанному на кастомном адаптере
Не обновлять айтемы в адаптере когда скроллим список Android
Android View Pager разные фрагменты на страницах, не понимаю как?
Как взять символы с DataPicker, что бы их сложить и вывести? Android

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

Или воспользуйтесь поиском по форуму:
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
21.06.2016, 16:07  [ТС]     Filterable не понимаю как в адаптере взять String значение по позиции ? #14
Но ваш способ тоже хорош.
хорош, но пока до сих пор одноногий..

Добавлено через 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();
    }
Yandex
Объявления
21.06.2016, 16:07     Filterable не понимаю как в адаптере взять String значение по позиции ?
Ответ Создать тему
Опции темы

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