Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
#1

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

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

есть 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 16:20
Ответы с готовыми решениями:

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

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

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

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

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

19
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
21.06.2016, 16:27 #2
disx, я обычно использовал обратные вызовы для определения, какой фрагмент будет делать фильтрацию, хотя, наверное, есть и другие варианты.
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
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
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
21.06.2016, 17:09 #4
а почему не?
Java
1
String text = cs.toString().toLowerCase();
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
21.06.2016, 17:20  [ТС] #5
Паблито,
а почему не?
да так покрасивше, поменял...
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
21.06.2016, 17:31 #6
и не полечилось?
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
21.06.2016, 17:54 #7
disx, ну попробуйте для начала передавать конкретное буквосочетание, например, "авто". И поставьте точки останова внутри фрагмента, поглядите, куда исчезают данные и показываются ли вообще.
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
22.06.2016, 09:50  [ТС] #8
Паблито, неа...

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

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

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

может как-то можно сам фрагмент обновить в этом методе:
Java
1
public void afterTextChanged
а?
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 10:21 #9
код фрагментов и адаптеров?
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
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
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 12:10 #11
я бы начал с того, что выводил в консоль prod.getName().toLowerCase(Locale.getDefault())
зачем там Locale.getDefault() вообще непонятно, все и без этого нормально будет работать

сразу будет видно - выполняется ли вообще этой условие с contains или нет
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
22.06.2016, 13:10  [ТС] #12
Паблито,
все и без этого нормально будет работать
поубирал, пока без изменений...
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 14:38 #13
Цитата Сообщение от Паблито Посмотреть сообщение
я бы начал с того, что выводил в консоль prod.getName().toLowerCase(Locale.getDefault())
Цитата Сообщение от Паблито Посмотреть сообщение
сразу будет видно - выполняется ли вообще этой условие с contains или нет
я не понимаю, проблему надо решить или нет? такое впечатление что каждый второй на форуме читает через строку и темы создаются просто так
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
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
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 16:03 #15
Log.d("myLogs", charText);
а эта строка выводит в лог именно те символы, которые вводятся в поле ввода?

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

сколько покажет размер?
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
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
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 16:32 #17
получается надо выводить в лог и смотреть размер массива который передается в BoxAdapter
0
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
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
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
22.06.2016, 18:48 #19
Лучший ответ Сообщение было отмечено disx как решение

Решение

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

он создается в oncreateview и в него передается указатель на список, который создается там же, во фрагменте и он пустой
естественно в конструкторе из пустого списка ничего не перекидываеся во временный
1
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 582
Записей в блоге: 1
22.06.2016, 23:42  [ТС] #20
я думаю, создание адаптера adapter = new BoxAdapter(getActivity(), products);
надо перенести из onCreateView в onPostExecute
Честь и хвала сэнсею Паблито,
был "грязным" Код, а теперь он "умытый"...
0
22.06.2016, 23:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 23:42

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

Сохранить измененные значения EditText в ListView при прокрутке
Добрый день, прошу помощи, т.к. уже долго и безрезультатно пытаюсь решить...

Как закрепить высоту EditText, чтобы помещался только один ряд символов
Как закрепить высоту EditText, чтобы помещался только один ряд символов, так...


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

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

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