Итак, у меня есть собственный адаптер с поиском. Я получил свой поиск, чтобы отображать правильные результаты всякий раз, когда я ищу определенного человека. Но когда я нажимаю на элемент в поиске, он возвращает результат из исходного списка.
Так, например, у меня есть элементы 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;
}
}
Благодарю вас!!