Фильтр поиска в списке возвращает неправильное значение при нажатии элемента - PullRequest
0 голосов

У меня есть собственный ListView с пользовательским фильтром, но после ввода данных в поле Edit_text, я изменил ListView и после нажатия на измененный список, я получаю неправильную информацию.Как мне решить эту проблему?

Когда я запускаю приложение самостоятельно, при нажатии отображается правильная информация, но после редактирования EditText и, следовательно, списка, у меня появляется совершенно неверная информация при нажатии.

DictionaryFragment

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_dictionary, container, false);

    listView = view.findViewById(R.id.dictionaryList);
    editText = view.findViewById(R.id.edit_search_dict);
    editText.addTextChangedListener(textWatcher);
    mylist = new ArrayList<>();
    SingleRow singleRow;

    for (int i = 0;i<mTitle.length;i++){
        singleRow = new SingleRow(mTitle[i],mDescriprion[i],images[i],mFind[i]);
        mylist.add(singleRow);
    }

    myAdapter = new MyAdapter(getActivity(),mylist);
    listView.setAdapter(myAdapter);

    return view;
}

    @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            mCallback.setMyVariableX(getListOfWords()[position]);
            FragmentManager manager = getFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
          transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            transaction.replace(R.id.fragment_container, new DetailFragment()).addToBackStack(null);
            transaction.commit();
        }
    });

MyAdapter

public class MyAdapter extends BaseAdapter implements Filterable {

DataCommunication mCallback;

Context c;
ArrayList<SingleRow> originalArray,tempArray;
CustomFilter cs;

public MyAdapter(Context c, ArrayList<SingleRow> originalArray){
    this.c = c;
    this.originalArray = originalArray;
    this.tempArray = originalArray;
}

@Override
public Object getItem(int i) {
    return originalArray.get(i);
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    LayoutInflater inflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.row,null);

    ImageView images = row.findViewById(R.id.imageViewKanji);
    TextView myTitle = row.findViewById(R.id.textView1);
    TextView myDescription = row.findViewById(R.id.textView2);

    myTitle.setText(originalArray.get(i).getTitle());
    myDescription.setText(originalArray.get(i).getDescription());
    images.setImageResource(originalArray.get(i).getImage());



    return row;
}

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

@Override
public long getItemId(int i) {
    //return originalArray.indexOf(getItemId(i));
    return i;
}

@Override
public Filter getFilter() {
    if (cs == null) {
        cs = new CustomFilter();
    }
    return cs;
}

class CustomFilter extends Filter{

    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        FilterResults results = new FilterResults();

        if (charSequence != null && charSequence.length() > 0) {

            charSequence = charSequence.toString().toUpperCase();
            ArrayList<SingleRow> filters = new ArrayList<>();

        for (int i = 0; i < tempArray.size(); i++) {
            if (tempArray.get(i).getTitle().toUpperCase().contains(charSequence)) {
                SingleRow singleRow = new SingleRow(tempArray.get(i).getTitle()
                        , tempArray.get(i).getDescription()
                        , tempArray.get(i).getImage()
                        ,tempArray.get(i).getKanji());
                filters.add(singleRow);
            }
        }
        for (int i = 0; i < tempArray.size(); i++) {
                if (tempArray.get(i).getDescription().toUpperCase().contains(charSequence)) {
                    SingleRow singleRow = new SingleRow(tempArray.get(i).getTitle()
                            , tempArray.get(i).getDescription()
                            , tempArray.get(i).getImage()
                           ,tempArray.get(i).getKanji());
                    filters.add(singleRow);
                }
            }
            for (int i = 0; i < tempArray.size(); i++) {
                if (tempArray.get(i).getKanji().toUpperCase().contains(charSequence)) {
                    SingleRow singleRow = new SingleRow(tempArray.get(i).getTitle()
                            , tempArray.get(i).getDescription()
                            , tempArray.get(i).getImage()
                            ,tempArray.get(i).getKanji());
                    filters.add(singleRow);

                }
            }

        results.count = filters.size();
        results.values = filters;
    }
        else
        {
            results.count = tempArray.size();
            results.values = tempArray;
        }

        return results;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        originalArray = (ArrayList<SingleRow>)filterResults.values;
        notifyDataSetChanged();
    }
}}

SingleRow

public class SingleRow {

String title;
String description;
int image;
String kanji;

public String getKanji() {
    return kanji;
}

public void setKanji(String kanji) {
    this.kanji = kanji;
}

public SingleRow(String title, String description, int image, String kanji){
    this.title = title;
    this.description = description;
    this.image = image;
    this.kanji = kanji;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public int getImage() {
    return image;
}

public void setImage(int image) {
    this.image = image;
}}

Пожалуйста, помогите мне с этим.Я пытался решить это, но все закончилось вылетом или пустым значением.Желательно показать, что нужно изменить или указать в коде.

GitHub: https://github.com/figyshkin/KanjiLearn

1 Ответ

1 голос
/ 15 мая 2019

Вам нужно получить список данных фильтра и после этого, если вы нажмете на любой элемент, вы получите правильные данные.

Пожалуйста, попробуйте использовать следующий код:

Создайте еще один глобальный список массивов:

ArrayList<SingleRow> finalfilters;

И инициализируйте внутри класса CustomFilter расширяет фильтр {

class CustomFilter extends Filter{
finalfilters = new ArrayList<>();

//After search set final search data into finalfilters list:

finalfilters=filters;

}

//Create one method who returns final search list:
public void getFilterList()
{
return finalfilter;
}

Вызовите getFilterList () в свою деятельность, установите другой список в основном классе активности, управляйте событиями кликов элемента списка и получайте отфильтрованные данные через индекс.

...