Member 13944810 Ответов: 0

У меня возникли проблемы с использованием for loop для поиска listview


Я разрабатываю приложение для Android, и у меня возникли проблемы с функцией поиска, потому что она не находит все значения, которые я ввожу. Похоже, что он находит только определенные строки, а не все, что заполнено в списке. Например, я могу найти название продукта AB и название продукта TA, но не название продукта.

Я подозреваю, что проблема в коде цикла for.

package com.example.user.sortiment;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Created by user on 11.05.2018
 */

public class SortimentAdapter extends BaseAdapter {

LayoutInflater mInflator;
List<Sortiment> map;
List<Sortiment> filterMap;

    public void performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();
        if (Objects.equals(filterString, "")) {
            filterMap = map;
            notifyDataSetChanged();
            return;
        }

        int count = map.size();
        filterMap = new ArrayList<Sortiment>(count);

        Sortiment filterableSortiment ;

        for (int i = 0; i < count; i++) {
            filterableSortiment = map.get(i);
            if 
(filterableSortiment.name.toLowerCase().contains(filterString)) {
                filterMap.add(filterableSortiment);
            }
        }

        notifyDataSetChanged();

    }

public SortimentAdapter(Context c, List<Sortiment> inputMap) {
    mInflator = (LayoutInflater) 
c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    map = inputMap;
    filterMap = inputMap;
}

@Override
public int getCount() {
    return filterMap.size();
}

@Override
public Object getItem(int position) {
    return filterMap.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = mInflator.inflate(R.layout.item_layout,null);
    TextView nameTextView = (TextView) v.findViewById(R.id.nameTextView);
    TextView priceTextView = (TextView) v.findViewById(R.id.priceTextView);

    Sortiment viewObject = filterMap.get(position);
    nameTextView.setText(viewObject.name);
    //priceTextView.setText(String.format("%.0f", prices.get(position)));
    priceTextView.setText(viewObject.ean.toString());

    return v;
}


Что я уже пробовал:

Я попробовал немного повозиться с циклом, но я все еще новичок среди Java.

David Crow

Вы прошли через код, чтобы точно узнать, что происходит? Я предлагаю вам сделать это первым, прежде чем просить о помощи. Таким образом, вы прошли через процесс выяснения таких вещей, как количество итераций цикла, каковы значения переменных, таких как constraint, filterString, count, i, и filterMap, и какой шаблон поисковых строк приводит к сбою/работе кода.

Mike V Baker

Вы могли бы использовать для (сортимент filterableSortiment : карта), а не использовать меня в качестве итератора. Но я не думаю, что это изменит ваши результаты, просто другой способ повторения. Записали ли вы содержимое своих варов в журнал, чтобы убедиться, что то, что вы ищете, существует? Мой первый метод отладки - проверка данных. Сбросить содержимое карты на консоль до выполнения цикла, и дамп содержимого filterableSortiment как оно испытывается.
п. С. не предварительно инициализировать filterMap по размеру карте. Вам никогда не понадобится так много, если все предметы не совпадут. Просто создайте его пустым, "добавить" расширит его.

0 Ответов