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

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

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

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

16.06.2016, 11:29. Просмотров 321. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2016, 11:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Filterable не понимаю как в адаптере взять String значение по позиции ? (Программирование Android):

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

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

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

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

Как взять значение name из input - JavaScript
Доброго времени суток, товарищи профи помогите новичку, перерыл весь гугл, хоть убей не могу найти решение моей проблемы. У меня есть...

Как взять значение из массива? - PHP
мне приходит json: {&quot;response&quot;:{&quot;count&quot;:109,&quot;items&quot;:} как проверить его на наличие поля 'acces_key' и если оно есть, то вывести в...

13
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.06.2016, 12:46 #2
Цитата Сообщение от disx Посмотреть сообщение
beforeTextChanged
? А, случаем, не afterTextChanged?
Java
1
BoxAdapter(Context context, ArrayList<Product> products)
Java
1
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
Нет ли здесь противоречия?
1
petruchodd
108 / 105 / 10
Регистрация: 23.06.2009
Сообщений: 580
16.06.2016, 12:50 #3
Java
1
String cannot be cast to com.dis.alprice.Product
ты ж везде класс возвращаешь, а не строку.
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 563
Записей в блоге: 1
16.06.2016, 13:11  [ТС] #4
CoolMind,
? А, случаем, не afterTextChanged?
взял из этого примера - ссыль

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

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

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

Примеров дох.. много, но почти все одинаковые, просто не могу понять как задействуется notifyDataSetChanged когда стираются буквы???
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
18.06.2016, 01:02 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от disx Посмотреть сообщение
как задействуется notifyDataSetChanged когда стираются буквы?
Этот метод "говорит" активности, что пора обновить список на экране, если изменился набор данных. Иногда адаптер делает это не сразу, поэтому надо вызывать метод.
С фильтрацией я сначала тоже мучался, у меня тоже была подобная проблема. Есть ещё один способ, там нет вложенного фильтра, адаптер основывается на некой коллекции, которую постоянно меняют по условию. Но ваш способ тоже хорош.
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 563
Записей в блоге: 1
21.06.2016, 16:07  [ТС] #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();
    }
0
21.06.2016, 16:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 16:07
Привет! Вот еще темы с ответами:

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

Как взять значение из textbox - C++ WinAPI
Здравствуйте! Подскажите, пожалуйста, как взять и записать в переменную значени из textboxа? Заранее благодарен!

как взять значение строки Gridview? - C# ASP.NET
добрый ребята , проблема, нужно передать значение (имя файла) которое записано в ячейке гридвью, чтобы скачать файл, если делать ето криво...

Как взять нужное значение из таблицы? - MS Excel
День добрый! Пытаюсь сделать электронный журнал в ВУЗ, т.к. система подсчётов конечного балла и отметки очень хитрая и руками занимает...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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