Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9283025
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 18, 20262026-06-18T18:31:30+00:00 2026-06-18T18:31:30+00:00

I have some data coming from database which I am showing in a list

  • 0

I have some data coming from database which I am showing in a list view before that I am arranging the items alphabetically using indexer.So my list is showing the items arranged alphabetically with section headers.Now I want to search items from list using the word entered in editText.How to do that I know we can use filter and textwatcher for that buthow to use that because the adapter I am setting to listview is not arrayadapter but is SimpleSectionAdapter.

dbHelper.openDataBase();
        Cursor cursor = dbHelper.fetchAllRecords();
        Log.v("count of records", cursor.getCount() + "");
        ArrayList<CategoryPojo> contents = new ArrayList<CategoryPojo>();
        cursor.moveToFirst();
        CategoryPojo cp;
        while (cursor.isAfterLast() == false) {
            cp = new CategoryPojo();
            cp.setCategoryName(cursor.getString(cursor
                    .getColumnIndex(DataBaseHelper.KEY_CATEGORIES)));
            cp.setCategoryImageName(cursor.getString(cursor
                    .getColumnIndex(DataBaseHelper.KEY_IMAGENAME)));
            cursor.moveToNext();
            contents.add(cp);
        }
        cursor.close();
        dbHelper.close();
        Collections.sort(contents, new Comparator<CategoryPojo>() {
            @Override
            public int compare(CategoryPojo s1, CategoryPojo s2) {
                return s1.getCategoryName().compareToIgnoreCase(
                        s2.getCategoryName());
            }
        });
        final CategoryAdapter adapter = new CategoryAdapter(this,
                android.R.layout.simple_list_item_1, contents);
        Sectionizer<CategoryPojo> alphabetSectionizer = new Sectionizer<CategoryPojo>() {
            @Override
            public String getSectionTitleForItem(CategoryPojo instance) {
                return instance.getCategoryName().substring(0, 1);
            }
        };
        final SimpleSectionAdapter<CategoryPojo> sectionAdapter = new SimpleSectionAdapter<CategoryPojo>(
                this, adapter, R.layout.section_header, R.id.title,alphabetSectionizer);
        listView.setFastScrollEnabled(true);
        listView.setTextFilterEnabled(true);
        listView.setAdapter(sectionAdapter);
        edtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {


            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });

And Simplesectionadapter is 

public class SimpleSectionAdapter extends BaseAdapter implements Filterable { private ArrayList mOriginalValues, mDisplayedValues;

static final boolean DEBUG = false;
static final String TAG = SimpleSectionAdapter.class.getSimpleName();
// Constants
private static final int VIEW_TYPE_SECTION_HEADER = 0;


private Context mContext;
private BaseAdapter mListAdapter;
private int mSectionHeaderLayoutId;
private int mSectionTitleTextViewId;
private Sectionizer<T> mSectionizer;
private LinkedHashMap<String, Integer> mSections;
AlphabetIndexer alphaIndexer;


public SimpleSectionAdapter(Context context, ArrayList<CategoryPojo> contents, BaseAdapter listAdapter,
        int sectionHeaderLayoutId, int sectionTitleTextViewId,
        Sectionizer<T> sectionizer) {

    if (context == null) {
        throw new IllegalArgumentException("context cannot be null.");
    } else if (listAdapter == null) {
        throw new IllegalArgumentException("listAdapter cannot be null.");
    } else if (sectionizer == null) {
        throw new IllegalArgumentException("sectionizer cannot be null.");
    } else if (!isTextView(context, sectionHeaderLayoutId,
            sectionTitleTextViewId)) {
        throw new IllegalArgumentException(
                "sectionTitleTextViewId should be a TextView.");
    }

    this.mOriginalValues = contents;
    this.mDisplayedValues = contents; 
    this.mContext = context;
    this.mListAdapter = listAdapter;
    this.mSectionHeaderLayoutId = sectionHeaderLayoutId;
    this.mSectionTitleTextViewId = sectionTitleTextViewId;
    this.mSectionizer = sectionizer;
    this.mSections = new LinkedHashMap<String, Integer>();

    // Find sections
    findSections();
}

private boolean isTextView(Context context, int layoutId, int textViewId) {
    View inflatedView = View.inflate(context, layoutId, null);
    View foundView = inflatedView.findViewById(textViewId);

    return foundView instanceof TextView;
}

@Override
public int getCount() {
    return mDisplayedValues.size();
    //return mListAdapter.getCount() + getSectionCount();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    SectionHolder sectionHolder = null;

    switch (getItemViewType(position)) {
    case VIEW_TYPE_SECTION_HEADER:
        if (view == null) {

            view = View.inflate(mContext, mSectionHeaderLayoutId, null);
            sectionHolder = new SectionHolder();
            sectionHolder.titleTextView = (TextView) view
                    .findViewById(mSectionTitleTextViewId);
            view.setTag(sectionHolder);
        } else {
            sectionHolder = (SectionHolder) view.getTag();
        }
        break;

    default:
        view = mListAdapter.getView(getIndexForPosition(position),
                convertView, parent);
        break;
    }

    if (sectionHolder != null) {
        String sectionName = sectionTitleForPosition(position);

        sectionHolder.titleTextView.setText(sectionName);
    }

    return view;
}

@Override
public boolean areAllItemsEnabled() {
    return mListAdapter.areAllItemsEnabled() ? mSections.size() == 0
            : false;
}

@Override
public int getItemViewType(int position) {
    int positionInCustomAdapter = getIndexForPosition(position);
    return mSections.values().contains(position) ? VIEW_TYPE_SECTION_HEADER
            : mListAdapter.getItemViewType(positionInCustomAdapter) + 1;
}

@Override
public int getViewTypeCount() {
    return mListAdapter.getViewTypeCount() + 1;
}

@Override
public boolean isEnabled(int position) {
    return mSections.values().contains(position) ? false : mListAdapter
            .isEnabled(getIndexForPosition(position));
}

@Override
public Object getItem(int position) {
    return mListAdapter.getItem(getIndexForPosition(position));
}

@Override
public long getItemId(int position) {
    return mListAdapter.getItemId(getIndexForPosition(position));
}

@Override
public void notifyDataSetChanged() {
    mListAdapter.notifyDataSetChanged();
    findSections();
    super.notifyDataSetChanged();
}

/**
 * Returns the actual index of the object in the data source linked to the
 * this list item.
 * 
 * @param position
 *            List item position in the {@link ListView}.
 * @return Index of the item in the wrapped list adapter's data source.
 */
public int getIndexForPosition(int position) {
    int nSections = 0;

    Set<Entry<String, Integer>> entrySet = mSections.entrySet();
    for (Entry<String, Integer> entry : entrySet) {
        if (entry.getValue() < position) {
            nSections++;
        }
    }

    return position - nSections;
}

static class SectionHolder {
    public TextView titleTextView;
}

private void findSections() {
    int n = mListAdapter.getCount();
    int nSections = 0;
    mSections.clear();

    for (int i = 0; i < n; i++) {
        @SuppressWarnings("unchecked")
        String sectionName = mSectionizer
        .getSectionTitleForItem((T) mListAdapter.getItem(i));

        if (!mSections.containsKey(sectionName)) {
            mSections.put(sectionName, i + nSections);
            nSections++;
        }
    }

    if (DEBUG) {
        Log.d(TAG, String.format("Found %d sections.", mSections.size()));
    }
}

private int getSectionCount() {
    return mSections.size();
}

private String sectionTitleForPosition(int position) {
    String title = null;

    Set<Entry<String, Integer>> entrySet = mSections.entrySet();
    for (Entry<String, Integer> entry : entrySet) {
        if (entry.getValue() == position) {
            title = entry.getKey();

            break;
        }
    }

    return title;
}



@Override
public Filter getFilter() {

    return new android.widget.Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {

            mDisplayedValues = (ArrayList<CategoryPojo>) results.values;

            // has
            // the
            // filtered
            // values

            notifyDataSetChanged(); // notifies the data with new filtered
            // values
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults(); // Holds the
            // results of a
            // filtering
            // operation in
            // values
            ArrayList<CategoryPojo> FilteredArrList = new ArrayList<CategoryPojo>();

            if (mOriginalValues == null) {

                mOriginalValues = new ArrayList<CategoryPojo>(mDisplayedValues); 

            }


            if (constraint == null || constraint.length() == 0) {

                // set the Original result to return
                results.count = mOriginalValues.size();
                results.values = mOriginalValues;
            } else {
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < mOriginalValues.size(); i++) {
                    String data = String.valueOf(mOriginalValues.get(i)
                            .getCategoryName());
                    if (data.toLowerCase()
                            .startsWith(constraint.toString())) {
                        FilteredArrList.add(new CategoryPojo(
                                mOriginalValues.get(i).getCategoryName(),
                                mOriginalValues.get(i)
                                .getCategoryImageName()));
                    }
                }
                // set the Filtered result to return
                results.count = FilteredArrList.size();
                results.values = FilteredArrList;
            }
            return results;
        }
    };
}

}

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-18T18:31:32+00:00Added an answer on June 18, 2026 at 6:31 pm

    Textwatcher code

    inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence cs,
                    int arg1, int arg2, int arg3) {
                // When user changed the Text
                mainmenu2.this.adapter1.getFilter().filter(
                        cs);
            }
    
            @Override
            public void beforeTextChanged(CharSequence arg0,
                    int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
            }
        });
    

    and inside

    public class SimpleSectionAdapter<T> extends BaseAdapter {
    

    implements Filterable like this

    public class SimpleSectionAdapter<T> extends BaseAdapter implements Filterable
    

    and then use this android.widget.Filter getFilter() inside SimpleSectionAdapter (“edit it according to ur’s, its just an example)

    public android.widget.Filter getFilter() {
            // TODO Auto-generated method stub
            return new android.widget.Filter() {
    
                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    // TODO Auto-generated method stub
                     mDisplayedValues = (ArrayList<Product>) results.values; // has the filtered values
                    notifyDataSetChanged();  // notifies the data with new filtered values
                }
    
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    // TODO Auto-generated method stub
                      FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                    ArrayList<Product> FilteredArrList = new ArrayList<Product>();
    
                    if (mOriginalValues == null) {
                        mOriginalValues = new ArrayList<Product>(mDisplayedValues); // saves the original data in mOriginalValues
                    }
    
                    /********
                     * 
                     *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                     *  else does the Filtering and returns FilteredArrList(Filtered)  
                     *
                     ********/
                    if (constraint == null || constraint.length() == 0) {
    
                        // set the Original result to return  
                        results.count = mOriginalValues.size();
                        results.values = mOriginalValues;
                    } else {
                        constraint = constraint.toString().toLowerCase();
                        for (int i = 0; i < mOriginalValues.size(); i++) {
                            String data = String.valueOf(mOriginalValues.get(i).fname);
                            if (data.toLowerCase().startsWith(constraint.toString())) {
                                FilteredArrList.add(new Product(mOriginalValues.get(i).id,mOriginalValues.get(i).fname,mOriginalValues.get(i).lname));
                            }
                        }
                        // set the Filtered result to return
                        results.count = FilteredArrList.size();
                        results.values = FilteredArrList;
                    }
                    return results;
                }
            };
        }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have some data from database coming out in a loop. Each of these
I have an entity which data comes from the database, however, some of its
I have a function that will parse some data coming in. My problem is
I have some data from log files and would like to group entries by
I have some data which (quite reasonably) uses null and false for different meanings.
I have some data that is stored in a TIMESTAMP(6) WITH TIMEZONE column in
I have some data which i need to make some statistics. I need to
I have some data that won't printf.... echo works, but not printf There is
I have data coming out of a SQLite database, normally, I grab an item
I do have a table which contain some data in it and a form

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.