Поиск в Android работает, но при нажатии отображается неверный результат.

Итак, у меня есть собственный адаптер с поиском. Я получил свой поиск, чтобы отображать правильные результаты всякий раз, когда я ищу определенного человека. Но когда я нажимаю на элемент в поиске, он возвращает результат из исходного списка.

Так, например, у меня есть элементы ab, cd, ef, и я ищу ef. Поисковое представление возвращает 1 элемент ef. Но если я нажму на нее, я получу данные для ab.

Как это исправить? Или мне нужно переопределить метод для onclick для поиска?

Спасибо. (Я опубликую свой код (я уберу несвязанный код), в моем пользовательском адаптере есть код просмотра поиска. Другой - мой фрагмент, который содержит мой список просмотра и списка).

My Custom Adapater. 



public class oncallAdapter extends ArrayAdapter<OnCallContact> implements SectionIndexer
{
    private ArrayList<OnCallContact> contactList;
    private Context context;

    //For our searchview
    private MyFilter filter;
    private ArrayList<OnCallContact> mcontactListFilter;

    //OUr adapter constructor
    //WE have an arraylist which represents the bulletin objects
    public oncallAdapter(ArrayList<OnCallContact> ONCALLLIST, Context ctx)
    {
        super(ctx, R.layout.list_item_oncall, ONCALLLIST);
        this.contactList = ONCALLLIST;
        this.context= ctx;
        this.mcontactListFilter = ONCALLLIST;
    }

    //This is what sets up the textviews or one item in the listview.
    //We are overiding the orignial method
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        //if null then inflate the view which is the row for the bulletins
        if(convertView == null)
        {
            LayoutInflater inflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflator.inflate(R.layout.list_item_oncall,parent,false);
        }



        TextView mgroup = (TextView) convertView.findViewById(R.id.oncall_group);
        TextView mname = (TextView) convertView.findViewById(R.id.oncall_name);
        TextView mCircleText = (TextView) convertView.findViewById(R.id.circleText);

        OnCallContact b = contactList.get(position);


        //Setting the textviews.
        mgroup.setText(b.getMgroup());
        mname.setText(b.getMname());
        mCircleText.setText(b.getMgroup().substring(0,1).toUpperCase());

        return convertView;
    }

    @Override
    public android.widget.Filter getFilter()
    {
        if(filter == null)
        {
            filter = new MyFilter();
        }

        return filter;
    }
 private class MyFilter extends android.widget.Filter
 {
    @Override
    protected android.widget.Filter.FilterResults performFiltering(CharSequence constraint)
    {
      FilterResults results = new FilterResults();

        if(constraint!= null && constraint.length()>0)
        {
            //Arraylist where we will add the items (oncallConcacts) that have the letter
            ArrayList<OnCallContact> filterList = new ArrayList<>();

            for(int i=0; i < mcontactListFilter.size();i++)
            {
                //CHecking if the letter is in the name
                if(mcontactListFilter.get(i).getMname().toUpperCase().contains(constraint.toString().toUpperCase()))
                {
                    OnCallContact contact = new OnCallContact();

                    contact.setMname(mcontactListFilter.get(i).getMname());
                    contact.setMgroup(mcontactListFilter.get(i).getMgroup());
                    contact.setMtitle(mcontactListFilter.get(i).getMtitle());
                    contact.setMbusinessPhone(mcontactListFilter.get(i).getMbusinessPhone());
                    contact.setMemail(mcontactListFilter.get(i).getMemail());
                    contact.setMpager(mcontactListFilter.get(i).getMpager());
                    contact.setmManagerName(mcontactListFilter.get(i).getmManagerName());
                    contact.setmManagerBusinessPhone(mcontactListFilter.get(i).getmManagerBusinessPhone());
                    contact.setmManagerPager(mcontactListFilter.get(i).getmManagerPager());
                    contact.setmManagerEmail(mcontactListFilter.get(i).getmManagerEmail());

                    filterList.add(contact);
                }
            }

            results.count = filterList.size();
            results.values = filterList;

            Log.v("HEre is the filtersize " , "" +filterList.size());
        }

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

        return results;
    }

     @Override
     protected void publishResults(CharSequence constraint, FilterResults results)
     {

         contactList = (ArrayList<OnCallContact>) results.values;
         notifyDataSetChanged();

     }
}

}

Мой класс фрагмента

  public class OnCallFragment extends android.support.v4.app.Fragment implements SearchView.OnQueryTextListener{

oncallAdapter adapter;

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

    //Parsing the xml file and getting the data we need which is an arraylist of oncallContacts
    OnCallXMLParser b = new OnCallXMLParser();
    final ArrayList<OnCallContact> list = b.parse(getContext());

    //HEre the custom adapter is making the listviews
    adapter = new oncallAdapter(list, getContext());
    final ListView listView = (ListView) rootView.findViewById(R.id.onCallListView);

    SearchView search = (SearchView)rootView.findViewById(R.id.onCall_searchView);
    search.setOnQueryTextListener(this);

    //displaying the listview by setting the adapter.
    listView.setAdapter(adapter);
    listView.setFastScrollEnabled(true);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //The contact we are passing through. (Item that was clicked on)
            OnCallContact temp = list.get(position);
            // Intent i = new Intent(getActivity(), DetailActivity.class).putExtra("extra", ForecastAdapter.getItem(position));
            Intent i = new Intent(getActivity(), OnCallDetail.class).putExtra("ContactInformation", temp);

            startActivity(i);
        }
    });

    // Inflate the layout for this fragment
    return rootView;
}

@Override
public boolean onQueryTextChange(String newText) {
    adapter.getFilter().filter(newText);
    return false;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

}

Благодарю вас!!


person huey77    schedule 19.02.2016    source источник
comment
попробуйте добавить adapter.notifyDataSetChanged() после adapter.getFilter().filter(newText) в метод onQueryTextChanged   -  person Arshad    schedule 19.02.2016
comment
Спасибо за предложение, но это не так :/ . Любое другое предложение или идея? @arshadkazmi42   -  person huey77    schedule 19.02.2016


Ответы (2)


Скорее всего, это связано с тем, что положение результата ef во всех отфильтрованных результатах и ​​положение результата ef во всех доступных элементах различаются. Вам нужно использовать другую переменную, такую ​​как самоопределяемый идентификатор, вместо использования позиции. Обратитесь к этому для получения дополнительной информации: Выбран неправильный элемент из списка и пользовательский фильтр ListView дает неправильный элемент, выбранный при фильтрации

person jackson95    schedule 24.02.2016

Для тех, кто сталкивается с этой проблемой, убедитесь, что вы переопределили свой getcount, getitem. GetItemId должен оставаться как return 0; Остальные 2 метода вы должны переопределить. Надеюсь, это поможет любому, кто может столкнуться с этим.

person huey77    schedule 02.03.2016