Is this a right way to filter an ArrayList containing text from strings.xml? I get nothing in the ListView when I enter some characters inside SearchView.
public class SearchActivity extends AppCompatActivity {
private ListView searchList;
private SearchListAdapter searchListAdapter;
private ArrayList<listContents> listArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
searchList = (ListView)findViewById(R.id.searchList);
listContents listC[] = new listContents[]{
new listContents(R.string.UtrujjTitle,R.string.UtrujjContent,R.drawable.image1),
new listContents(R.string.AruzzTitle,R.string.AruzzContainer,R.drawable.image2),
new listContents(R.string.ArzTitle,R.string.ArzContainer,R.drawable.image3)
};
listArray = new ArrayList<>(Arrays.asList(listC));
searchListAdapter = new SearchListAdapter(getApplicationContext(),listArray);
searchList.setAdapter(searchListAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search, menu);
final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.searchable).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
ArrayList<listContents> filtered = new ArrayList<listContents>();
for (int i = 0; i < listArray.size() ; i++){
String title = String.valueOf(listArray.get(i).getTitleList());
String contain = String.valueOf(listArray.get(i).getContentList());
if (title.contains(newText) || contain.contains(newText)){
listContents contents = new listContents(listArray.get(i).getTitleList(),
listArray.get(i).getContentList(),listArray.get(i).getImageList());
filtered.add(contents);
}
searchListAdapter = new SearchListAdapter(getApplicationContext(),filtered);
searchList.setAdapter(searchListAdapter);
}
return false;
}
});
return true;
}
}
Adapter class
public class SearchListAdapter extends ArrayAdapter<listContents> {
private Context context;
private listContents[] listContentsList;
private ArrayList<listContents> lister;
public SearchListAdapter(Context context, ArrayList<listContents> list ) {
super(context,0,list);
this.context = context;
this.lister = list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
listContents listContents = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.listresults, parent, false);
}
TextView title = (TextView) convertView.findViewById(R.id.listTitle);
title.setText(listContents.getTitleList());
TextView content = (TextView)convertView.findViewById(R.id.listContain);
content.setText(listContents.getContentList());
ImageView imageView = (ImageView)convertView.findViewById(R.id.listImage);
imageView.setImageResource(listContents.getImageList());
return convertView;
}
}
SearchListAdapterand callsearchList.setAdapter(searchListAdapter);outside the for loop so it is only done once after all filtered items have been added. Besides that have you tried callingsearchList.notifyDataSetChanged();after setting the adapter? If yes and still no results are shown are you sure anything is ever being added tofiltered? Might want to add aLogstatement or debug that method to be sure.ArrayAdapteras shown in the answer from @AllenG.