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

Живой поиск через один EditText в разных Listview ?

21.06.2016, 16:20. Показов 1492. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть EditText для поиска по спискам в ToolBar MainActivity.

при вводе текста в MainActivity вызывается:
Java
1
2
3
4
5
6
7
8
9
10
@Override
            public void afterTextChanged(Editable cs) {
                String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                if (numTab==0) {
                    OneFragment.adapter.filter(text);
                }
                if (numTab==1) {
                    TwoFragment.adapter.filter(text);
                }
            }
но при вводе хотябы одного символа список становится пустым, хотя если этот же метод (и EditText) перенести напр. в layout OneFragment, то все четко работает....

что я могу делать не так ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2016, 16:20
Ответы с готовыми решениями:

Ввод в один EditText и авто-вычисление в двух других EditText
Всем привет. Есть три поля EditText,виртуальные клавиатуры у всех заблокированы,а ввод чисел в...

Сделать живой поиск на jquery через запятую
Возможно сделать живой поиск на jquery через запятую? Нашел только вот это...

Фильтрация ListView из EditText
Не могу разобраться с фильтрацией в ListView. Фильтрация происходит правильно (находит нужное...

Создание ListView из EditText
Выдает ошибку в строке при создании адаптера. Пишет, что не распознает конструкцию ArrayAdapter...

19
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
21.06.2016, 16:27 2
disx, я обычно использовал обратные вызовы для определения, какой фрагмент будет делать фильтрацию, хотя, наверное, есть и другие варианты.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
21.06.2016, 16:55  [ТС] 3
CoolMind,
обратные вызовы для определения, какой фрагмент будет делать фильтрацию
, пока не воображаю как это делается,...

..хотя даже хоть и так :
Java
1
2
3
4
5
@Override
            public void afterTextChanged(Editable cs) {
                String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                    OneFragment.adapter.filter(text);                       
            }
результат тот же... - пустой список при вводе...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2016, 17:09 4
а почему не?
Java
1
String text = cs.toString().toLowerCase();
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
21.06.2016, 17:20  [ТС] 5
Паблито,
а почему не?
да так покрасивше, поменял...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2016, 17:31 6
и не полечилось?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
21.06.2016, 17:54 7
disx, ну попробуйте для начала передавать конкретное буквосочетание, например, "авто". И поставьте точки останова внутри фрагмента, поглядите, куда исчезают данные и показываются ли вообще.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 09:50  [ТС] 8
Паблито, неа...

CoolMind, попробую...

Добавлено через 15 часов 6 минут
Паблито, CoolMind, короче в фильтр значение переменной text попадает- это показывают логи...

но список опять же просто очищается (или не отображается при вводе символа)...

может как-то можно сам фрагмент обновить в этом методе:
Java
1
public void afterTextChanged
а?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 10:21 9
код фрагментов и адаптеров?
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 11:25  [ТС] 10
Паблито,

OneFragment(Tab of ViewPager):
Кликните здесь для просмотра всего текста
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
public class OneFragment extends Fragment {
 
    public Elements content;
    public Elements price;
    ArrayList<Product> products = new ArrayList<Product>();
    static BoxAdapter adapter;
    ListView lv;
    EditText inputSearch;
    
    public OneFragment() {
        // Required empty public constructor
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_one, container, false);
 
        lv = (ListView) view.findViewById(R.id.listView);
       
        adapter = new BoxAdapter(getActivity(), products);
        new NewThread().execute();
 
        return view;
 
    }
 
    public class NewThread extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... arg) {
            Document doc;
            try {
                doc = Jsoup.connect("http://alvideo.su/catalog/video/video-max/1/").get();
              
               content = doc.select(".product-name");
                price = doc.select("[class=price]");
          
                products.clear();
                for (int i = 0; i < content.size(); i++) {
 
                    String st = price.get(i).text();
                    String div = ".";
                    int divider = st.indexOf(div);
                    String trimst = st.substring(0,divider);
                    st=trimst;
                 //   Log.d("tagLog", stc);
                        int cost = Integer.parseInt(st);
                        int curse = Integer.parseInt(MainActivity.curs);
                        int baks = cost/curse;
                    String  curs=String.valueOf(baks);
                    products.add(new Product(content.get(i).text(), price.get(i).text(), "("+curs+"$)"));
                }
 
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        @Override
        protected void onPostExecute(String result) {
            lv.setAdapter(adapter);
        }
    }
 
}


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
public class BoxAdapter extends BaseAdapter  {
    Context ctx;
    LayoutInflater lInflater;
    private List<Product> list = null; //Список
    private ArrayList<Product> objects; //массив для фильтра списка
    Product p;
 
    BoxAdapter(Context context, List<Product> list) {
        ctx = context;
        //objects = products;
        this.list = list;
        lInflater = LayoutInflater.from(ctx);
        this.objects = new ArrayList<Product>();
        this.objects.addAll(list);
 
    }
 
    // кол-во элементов
    @Override
    public int getCount() {
        return list.size();
    }
 
    // элемент по позиции
    @Override
    public Object getItem(int position) {
        return list.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.getName());
        ((TextView) view.findViewById(R.id.pro_item_price)).setText(p.getPrice() + "");
        ((TextView) view.findViewById(R.id.textCurs)).setText(p.getCurs() + "");
 
        return view;
    }
 
    // товар по позиции
    Product getProduct(int position) {
        return ((Product) getItem(position));
    }
 
 
 
    // Filter Class
    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();
    }
}


MainActivity(в onCreate):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence cs, int start, int count, int after) {
 
            }
 
            @Override
            public void onTextChanged(CharSequence cs, int start, int before, int count) {
 
            }
 
            @Override
            public void afterTextChanged(Editable cs) {
 
                String text = cs.toString().toLowerCase();//inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                OneFragment.adapter.filter(text);
 
            }
        });


Разметка Main:
Кликните здесь для просмотра всего текста
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
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
 
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
        <EditText
            android:layout_width="50dp"
            android:layout_height="25dp"
            android:id="@+id/myEditText"
            android:layout_gravity="right"
            android:layout_margin="5dp"
android:textColor="#832828"
 
            android:background="#fff5d2" >
 
            </EditText>
            </android.support.v7.widget.Toolbar>
 
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/inputSearch"
            android:hint="Search products.."
            android:inputType="textVisiblePassword"/>
 
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimaryDark"
            app:tabMode="scrollable"
            app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>
 
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"  />
</android.support.design.widget.CoordinatorLayout>


fragment_one:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1">
 
    
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp" />
 
</LinearLayout>
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 12:10 11
я бы начал с того, что выводил в консоль prod.getName().toLowerCase(Locale.getDefault())
зачем там Locale.getDefault() вообще непонятно, все и без этого нормально будет работать

сразу будет видно - выполняется ли вообще этой условие с contains или нет
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 13:10  [ТС] 12
Паблито,
все и без этого нормально будет работать
поубирал, пока без изменений...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 14:38 13
Цитата Сообщение от Паблито Посмотреть сообщение
я бы начал с того, что выводил в консоль prod.getName().toLowerCase(Locale.getDefault())
Цитата Сообщение от Паблито Посмотреть сообщение
сразу будет видно - выполняется ли вообще этой условие с contains или нет
я не понимаю, проблему надо решить или нет? такое впечатление что каждый второй на форуме читает через строку и темы создаются просто так
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 15:56  [ТС] 14
Паблито,
надо решит или нет? такое впечатление что каждый второй на форуме читает через строку
да очень надо,...

похоже так и есть, но я не специально ( )

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        Log.d("myLogs", charText);
        list.clear();
        if (charText.length() == 0) {
            list.addAll(objects);
            Log.d("myLogs", "length==0");:-[ :read:
        }
        else
        {
            Log.d("myLogs", "else");
            for (Product prod : objects)
            {
                Log.d("myLogs", "For");
                Log.d("myLogs", prod.getName().toLowerCase(Locale.getDefault()));
                if (prod.getName().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    list.add(prod);
                }
            }
        }
        notifyDataSetChanged();
    }
пишет в лог это -
Java
1
Log.d("myLogs", charText);
и это -
Java
1
Log.d("myLogs", "else");
остальное не пишет ничего..., т.е. следовательно оно не выполняется?!

Добавлено через 6 минут
а и это работает
Java
1
Log.d("myLogs", "length==0");
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 16:03 15
Log.d("myLogs", charText);
а эта строка выводит в лог именно те символы, которые вводятся в поле ввода?

а если после этой строки поставить что-то типа
Log.d("myLogs", ""+objects.size());

сколько покажет размер?
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 16:11  [ТС] 16
Паблито,
а эта строка выводит в лог именно те символы
да,
Java
1
а если после этой строки поставить что-то типа
XML
1
2
3
06-22 13:09:03.461 20583-20583/com.dis.alprice D/myLogs: auto
06-22 13:09:03.461 20583-20583/com.dis.alprice D/myLogs: size 0
06-22 13:09:03.461 20583-20583/com.dis.alprice D/myLogs: else
т.е. типа size 0?!
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 16:32 17
получается надо выводить в лог и смотреть размер массива который передается в BoxAdapter
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 17:15  [ТС] 18
Паблито,
выводить в лог и смотреть размер массива который передается в BoxAdapter
если правильно понял размер [] который передается объекту BoxAdapter в OneFragment...?!

XML
1
2
06-22 14:12:50.297 12666-12666/com.dis.alprice D/myLogs: Fragment_onCreate__products: 0
06-22 14:12:50.781 12666-12666/com.dis.alprice D/myLogs: Fragment_Async_onPostExecute__products: 24
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.06.2016, 18:48 19
Лучший ответ Сообщение было отмечено disx как решение

Решение

я думаю, создание адаптера adapter = new BoxAdapter(getActivity(), products);
надо перенести из onCreateView в onPostExecute

он создается в oncreateview и в него передается указатель на список, который создается там же, во фрагменте и он пустой
естественно в конструкторе из пустого списка ничего не перекидываеся во временный
1
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
22.06.2016, 23:42  [ТС] 20
я думаю, создание адаптера adapter = new BoxAdapter(getActivity(), products);
надо перенести из onCreateView в onPostExecute
Честь и хвала сэнсею Паблито,
был "грязным" Код, а теперь он "умытый"...
0
22.06.2016, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 23:42
Помогаю со студенческими работами здесь

Поиск в БД через ListView
Приветствую всех знатоков ASP.net. Подключил БД к listView, как показано на рис(есть добавление,...

EditText.Listener внутри ListView
Добрый день. Помогите пожалуйста с задачкой. У меня есть ListView, который пополняется записями...

EditText в одном из Item ListView
Помогите решить довольно нестандартную задачу. У меня есть ListView, есть Adapter который делает...

Прокрутка ListView в начало при обновлении EditText
Всем привет! Проблема следующая - имеется ListView с адаптером. Элементы ListView - кастомные...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru