Custom Filtering Arrayadapter in Listview

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.

  1. Proper implementation of ListTO, although it has nothing to do with your goal right now
  2. Implement custom filter
  3. 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



Leave a reply



Submit