Custom Filtering ArrayAdapter in ListView
Your problem are this lines:
this.original = items;
this.fitems = items;
Items is the list you use for your ListView and putting it in two different variables does not make two different lists out of it. You are only giving the list items two different names.
You can use:
this.fitems = new ArrayList(items);
that should generate a new List and changes on this list will only change the fitems list.
Custom Filtering ArrayAdapter in ListView not working for imageview
You can have a look at this reference.
This is solved and working thing same as per your requirement.
Search Filtering List View
Go through with this link and let me know if you have still issues.
EDIT:
You have to maintain one dummy_drawable ArrayList
same as drawable ArrayList
and just keep your drawable ArrayList
as base only and use dummy_drawable
in your adapter.
Also update this dummy_drawable ArrayList
from your FilterResults
method. Like this:
dummy_drawable.clear();
for (int i = 0, l = originalList.size(); i < l; i++) {
// ArrayList<HashMap<String, String>> p =
// originalList.get(i);
HashMap<String, String> p = originalList.get(i);
if (p.toString().toLowerCase().contains(constraint)){
filteredItems.add(p);
dummy_drawable.add(drawable.get(i));
}
}
Thanks.
android filter custom array adapter and bring back old items again
My solution:
public class ResultsArrayAdapter extends ArrayAdapter<SuchErgebnis> {
Context myContext;
int layoutResourceId;
ArrayList<SuchErgebnis> ergebnisListeOriginal = null;
ArrayList<SuchErgebnis> ergebnisListeGefiltert = null;
private Filter filter;
public ResultsArrayAdapter(Context context, int textViewResourceId,
ArrayList<SuchErgebnis> objects) {
super(context, textViewResourceId, objects);
this.myContext = context;
this.layoutResourceId = textViewResourceId;
this.ergebnisListeOriginal = new ArrayList<SuchErgebnis>(objects);
this.ergebnisListeGefiltert = new ArrayList<SuchErgebnis>(objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ErgebnisHolder eHolder = null;
SuchErgebnis ergebnis = ergebnisListeGefiltert.get(position);
if (row == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) myContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.ergebnis_list_item, parent, false);
eHolder = new ErgebnisHolder();
eHolder.eTitel = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_titel);
eHolder.eInfo = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_info);
eHolder.eTreffer = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_treffer);
row.setTag(eHolder);
} else { // Wurde schoneinmal geladen, Views sind noch gespeichert...
eHolder = (ErgebnisHolder) row.getTag();
}
eHolder.eTitel.setText(ergebnis.titel);
eHolder.eInfo.setText(ergebnis.info != null ? ergebnis.info : "");
eHolder.eTreffer.setText(ergebnis.treffer != null ? ergebnis.treffer
: "");
row.setPadding(
ergebnis.isChild ? Main.mFHelper
.getPixels(10 * ergebnis.childNumber) : 0, 0, 0, 0);
return row;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ResultFilter();
}
return filter;
}
static class ErgebnisHolder {
TextView eTitel;
TextView eInfo;
TextView eTreffer;
}
@Override
public int getCount() {
return ergebnisListeGefiltert.size();
}
@Override
public SuchErgebnis getItem(int position) {
return ergebnisListeGefiltert.get(position);
}
private class ResultFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
String filterText = constraint.toString().toLowerCase();
if (filterText == null || filterText.length() == 0) {
synchronized (this) {
results.values = ergebnisListeOriginal;
results.count = ergebnisListeOriginal.size();
}
} else {
ArrayList<SuchErgebnis> gefilterteListe = new ArrayList<SuchErgebnis>();
ArrayList<SuchErgebnis> ungefilterteListe = new ArrayList<SuchErgebnis>();
synchronized (this) {
ungefilterteListe.addAll(ergebnisListeOriginal);
}
for (int i = 0, l = ungefilterteListe.size(); i < l; i++) {
SuchErgebnis m = ungefilterteListe.get(i);
if (m.titel.toLowerCase().contains(filterText)) {
gefilterteListe.add(m);
}
}
results.values = gefilterteListe;
results.count = gefilterteListe.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
ergebnisListeGefiltert = (ArrayList<SuchErgebnis>) results.values;
if(results.count > 0)
{
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
}
}
Filtering custom ListView with multiple TextViews using a Filter on an ArrayAdapterT implements Parcelable
In your publishResults
method:
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
You're not setting the filtered results on your adapter as the new dataset to display before invaliding the dataset. Also, you should be keeping a copy of your original values as well, so if they empty out the query you can retain and reset the original results.
Edit for Framework example code:
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/widget/ArrayAdapter.java#ArrayAdapter.ArrayFilter
Custom filtering for Custom ArrayAdapter in ListView
i could solve my Problems. Here my solution!
package hsos.ds.helper;
import hsos.ds.db.Poi;
import java.util.ArrayList;
import java.util.List;
import android.widget.Filter;
public class ItemsFilter extends Filter {
private PoiListAdapter poiAdapter;
private List<Poi> valuesPoi;
private List<Poi> filteredPoi;
public ItemsFilter(PoiListAdapter _poiAdapter) {
this.poiAdapter = _poiAdapter;
this.valuesPoi = poiAdapter.getValuesPoi();
this.filteredPoi = poiAdapter.getFilteredPoi();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
constraint = constraint.toString().toLowerCase();
if (constraint == null || constraint.length() == 0) {
ArrayList<Poi> list = new ArrayList<Poi>(valuesPoi);
result.values = valuesPoi;
result.count = valuesPoi.size();
} else {
final ArrayList<Poi> orginalList = new ArrayList<Poi>(valuesPoi);
final ArrayList<Poi> filterList = new ArrayList<Poi>();
int count = orginalList.size();
for (int i = 0; i < count; i++) {
final Poi p = orginalList.get(i);
if (p.getName().toLowerCase().contains(constraint))
filterList.add(p);
}
result.values = filterList;
result.count = filterList.size();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredPoi = (List<Poi>) results.values;
poiAdapter.notifyDataSetChanged();
poiAdapter.clear();
int count = filteredPoi.size();
for (int i = 0; i < count; i++) {
poiAdapter.add(filteredPoi.get(i));
poiAdapter.notifyDataSetInvalidated();
}
}
}
and the Adapter:
public class PoiListAdapter extends ArrayAdapter implements Filterable {
private List<Poi> valuesPoi;
private List<Poi> filteredPoi;
private ItemsFilter mFilter;
public PoiListAdapter(Context context, List<Poi> valuesPoi) {
super(context, R.layout.poilist);
this.valuesPoi = new ArrayList<Poi>(valuesPoi);
this.filteredPoi = new ArrayList<Poi>(valuesPoi);
this.mFilter = new ItemsFilter(this);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.poilist, null);
}
Poi p = filteredPoi.get(position);
if (p != null) {
TextView tt = (TextView) v.findViewById(R.id.name_poi);
TextView bt = (TextView) v.findViewById(R.id.discrip_poi);
if (tt != null) {
tt.setText(p.getName());
}
if (bt != null) {
bt.setText(p.getDiscription());
}
}
return v;
}
@Override
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemsFilter(this);
}
return mFilter;
}
public List<Poi> getValuesPoi() {
return valuesPoi;
}
public List<Poi> getFilteredPoi() {
return filteredPoi;
}
}
To show the complete list onStart()
i insert the a little "hack" in the onStart()
-Method of my activity because the complete list is shown after an input:
if(searchText!=null){
searchText.setText(" ");
searchText.setText("");
}
Custom getFilter in custom ArrayAdapter in android
You are having problem, mainly because you are using custom object. If you pass a String or int value to array adapter its know how to filter it. But if you pass custom object default filter implementation have to no idea how to deal with that.
Although it is not clear what you are trying to do in your filter i recommend you following steps.
- Proper implementation of
ListTO
, although it has nothing to do with your goal right now - Implement custom filter
- return your filter
Implement custom filter
First thing you have to do is, implements
Filterable
from your array adapter.
Second, provide implementation of your Filter
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<ListTO> tempList=new ArrayList<ListTO>();
//constraint is the result from text you want to filter against.
//objects is your data set you will filter from
if(constraint != null && objects!=null) {
int length=objects.size();
int i=0;
while(i<length){
ListTO item=objects.get(i);
//do whatever you wanna do here
//adding result set output array
tempList.add(item);
i++;
}
//following two lines is very important
//as publish result can only take FilterResults objects
filterResults.values = tempList;
filterResults.count = tempList.size();
}
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
objects = (ArrayList<ListTO>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
Last step,
@Override
public Filter getFilter() {
return myFilter;
}
Related Topics
Camera Preview Is in Portrait Mode But Image Captured Is Rotated
Register Receiver in a Service
Action Bar Back Button Not Working
Android - Creating a New Activity in Eclipse
Evenly Spaced Menu Items on Toolbar
Google Map for Android My Location Custom Button
How to Kill All Running Applications in Android
Does Android Service Run from a Separated Thread Instead of UI
How to Store Files Generated from App in "Downloads" Folder of Android
How to Use Percentage for Android Layout
How to Import Eclipse Library Project from Github to Android Studio Project
Android Edittext Listener for Cursor Position Change