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

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

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

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

21.06.2016, 16:20. Просмотров 402. Ответов 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, то все четко работает....

что я могу делать не так ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Живой поиск через один EditText в разных Listview ? (Программирование Android):

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

Фильтрация ListView из EditText - Программирование Android
Не могу разобраться с фильтрацией в ListView. Фильтрация происходит правильно (находит нужное количество), но выводит не те, которые нужно...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
21.06.2016, 16:27 #2
disx, я обычно использовал обратные вызовы для определения, какой фрагмент будет делать фильтрацию, хотя, наверное, есть и другие варианты.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 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);                       
            }
результат тот же... - пустой список при вводе...
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,746
Завершенные тесты: 1
21.06.2016, 17:09 #4
а почему не?
Java
1
String text = cs.toString().toLowerCase();
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
21.06.2016, 17:20  [ТС] #5
Паблито,
а почему не?
да так покрасивше, поменял...
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,746
Завершенные тесты: 1
21.06.2016, 17:31 #6
и не полечилось?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
21.06.2016, 17:54 #7
disx, ну попробуйте для начала передавать конкретное буквосочетание, например, "авто". И поставьте точки останова внутри фрагмента, поглядите, куда исчезают данные и показываются ли вообще.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
22.06.2016, 09:50  [ТС] #8
Паблито, неа...

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

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

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

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

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

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

сколько покажет размер?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 16:03
Привет! Вот еще темы с ответами:

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

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

EditText смещается вниз при вводе текста, который занимает объём больше, чем EditText - Программирование Android
EditText сещается вниз при вводе текста который занимает обём больше чем EditText. Как устранить?

EditText и добавление символов в него через собственную "клавиатуру" - Программирование Android
Ребятушки привет! я начинающий андроид девелопер....и столкнулся с такой трудностью.. Пишу калькулятор, у меня есть EditText и 10...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.06.2016, 16:03
Ответ Создать тему
Опции темы

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