Question

premise: i'm newbie on Java and Android, and i've search a lot for this but i don't understand how implement getFilter in my code.

this is MainActivity (relevant code):

public void loadList() {

  /* allProd and allSpec are ArrayList<String> */
  String[] allProdString = allProd.toArray(new String[allProd.size()]);
  String[] allSpecString = allSpec.toArray(new String[allSpec.size()]);

  listViewAdapter = new ListViewAdapter(this, allProdString, allSpecString);

  listView.setAdapter(listViewAdapter);

}

this is customAdapter:

public class ListViewAdapter extends BaseAdapter {

Activity context;
String title[];
String description[];

public ListViewAdapter(Activity context, String[] title, String[] description) {

    super();
    this.context = context;
    this.title = title;
    this.description = description;
}

public int getCount() {
    return title.length;
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

private class ViewHolder {

    TextView txtViewTitle;
    TextView txtViewDescription;

}

public View getView(int position, View convertView, ViewGroup parent) {

    Typeface typeface = Typeface.createFromAsset(context.getAssets(), "font/Simple_Print.ttf");

    ViewHolder holder;
    LayoutInflater inflater =  context.getLayoutInflater();

    if (convertView == null) {

        convertView = inflater.inflate(R.layout.tabella_prodotti, null);
        holder = new ViewHolder();
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);

        holder.txtViewDescription.setTypeface(typeface);
        holder.txtViewTitle.setTypeface(typeface);

        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtViewTitle.setText(title [position]);
    holder.txtViewDescription.setText(description [position]);

    return convertView;

 }

}

how can I implement this function to have the ability to search within an array, and show the filtered results in the listview?

if you need any other info just ask! thanks

Was it helpful?

Solution 2

I have found a solution and share with you, I added addTextChangedListener to inputSearch in MainActivity:

inputSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

            textLength = inputSearch.getText().length();
            //allProd_sort and allSpec_sort are ArrayList for search
            allProd_sort.clear();
            allSpec_sort.clear();
            String text = inputSearch.getText().toString();

            //allProdString is the String get from ArrayList allProd
            for (int y =0; y<allProdString.length; y++) {

                  //in my case the search works only if there are min 3 characters in search
                 if (textLength <= allProdString[y].length() && textLength >=3) {

                      if (Pattern.compile(Pattern.quote(text), Pattern.CASE_INSENSITIVE)
                                .matcher(allProdString[y]).find()) {

                          allProd_sort.add(allProdString[y]);
                          allSpec_sort.add(allSpecString[y]);
                      }
                  }
               }

               String[] allProdStringSort = allProd_sort.toArray(new String[allProd_sort.size()]);
               String[] allSpecStringSort = allSpec_sort.toArray(new String[allSpec_sort.size()]);

               listView.setAdapter(new ListViewAdapter(MainActivity.this, allProdStringSort, allSpecStringSort));
            }

        @Override
        public void afterTextChanged(Editable editable) {

      }
  });

OTHER TIPS

I think that your adapter should look like this. Also I would not recommend to instantiate objects inside getView() i.e typeface object

 public class ListViewAdapter extends BaseAdapter {
    String title[];
    String description[];
    ArrayList<String> filteredTitleList;
    ArrayList<String> filteredDescripionList;
    Typeface typeface;
    LayoutInflater inflater;

    public ListViewAdapter(Activity context, String[] title, String[] description) {
        super();
        this.context = context;
        this.title = title;
        this.description = description;

        typeface = Typeface.createFromAsset(context.getAssets(),"font/Simple_Print.ttf");

        inflater = context.getLayoutInflater();

        this.filteredTitleList = new ArrayList<String>();
        this.filteredDescripionList = new ArrayList<String>();
        applyFilter(null);
    }

    public void applyFilter(String filter){
        filteredTitleList.clear();
        filteredDescripionList.clear();

        for(int i=0; i < this.title.length; i++){
            String tempTitle = title[i];
            String tempDesc = description[i];

            if(filter == null || filter.equals("")){
                this.filteredTitleList.add(tempTitle);
                this.filteredDescripionList.add(tempDesc);
            }
            else if(tempTitle.toLowerCase().contains(filter.toLowerCase()) || tempDesc.toLowerCase().contains(filter.toLowerCase())){
                this.filteredTitleList.add(tempTitle);
                this.filteredDescripionList.add(tempDesc);
            }

        }
        this.notifyDataSetChanged();
    }

    public int getCount() {
        return filteredTitleList.size();
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return position;
    }

    private class ViewHolder {

        TextView txtViewTitle;
        TextView txtViewDescription;

    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if (convertView == null) {

            convertView = inflater.inflate(R.layout.tabella_prodotti, null);
            holder = new ViewHolder();
            holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
            holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);

            holder.txtViewDescription.setTypeface(typeface);
            holder.txtViewTitle.setTypeface(typeface);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.txtViewTitle.setText(this.filteredTitleList.get(position));
        holder.txtViewDescription.setText(this.filteredDescriptionList.get(position));

        return convertView;

     }

    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top