Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search Functionality for Listview

i'm new to android. I'm just trying to make one simple search functionality for my app. My app consists one ListView one EditText and one Button for search. My ListView contents are listed from database using custom adapter which is extends BaseAdapter

Now, what i'm trying to do is, i want to search any records from ListView For example, if i've some records like

Optimization, Operations, Data Mining, Computer Ethics, Computer Architecture and etc...

So, when i type some record name like op

The listview should listed the records which is started from op... I've referred something for this, from i got addTextChangedListener But, i don't know how to do this?

And, Can we do this same functionality with click of button

Has anyone having any idea on this? Thanks in advance.

like image 510
Kumar Avatar asked Sep 11 '12 06:09

Kumar


People also ask

How do I search in list view?

This article explains how to search for Item in a ListView. First, you will create an XML file and use an EditText and ListView. The EditText is used to search for an item and the ListView is used to show the list of items. Now you will create a Java file and write code to show an item in a ListView.

What is ListView used for?

Android ListView is a ViewGroup that is used to display the list of items in multiple rows and contains an adapter that automatically inserts the items into the list. The main purpose of the adapter is to fetch data from an array or database and insert each item that placed into the list for the desired result.

How do I create a search bar on Android?

Add the Search View to the App Bar To add a SearchView widget to the app bar, create a file named res/menu/options_menu. xml in your project and add the following code to the file. This code defines how to create the search item, such as the icon to use and the title of the item.

How do I add a filter to my adapter?

In its simplest form, you just create an array adapter passing it a list of objects (that have a proper toString() method). Then you type some characters to the textbox and by default it will filter the results searching in the beginning of the backing object's toString() result.


2 Answers

I had asked a similar kinda question a while back. Here: Filtering a ListView with Baseadapter filters text not images. Although, my specific question concerned a GridView, the concept (and the code) can be substituted for a ListView.

NOTE: This will be a lengthy post but I think necessary for the sake of completeness (I am leaving out the imports though)

The main activity (Friends.java)

public class Friends extends SherlockActivity {

    // BUNDLE OBJECT TO GET DATA FROM EARLIER ACTIVITY
    Bundle extras;

    // INITIAL ALBUM ID AND NAME
    String initialUserID;

    // THE GRIDVIEW
    GridView gridOfFriends;

    // THE ADAPTER
    FriendsAdapter adapter;

    // ARRAYLIST TO HOLD DATA
    ArrayList<getFriends> arrFriends;

    // LINEARLAYOUT TO SHOW THE FOOTER PROGRESS BAR
    LinearLayout linlaProgressBar;

    // THE EDITTEXT TO FILTER USERS
    EditText filterText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.friends_grid_list);

        extras = getIntent().getExtras();

        if (extras.containsKey("USER_ID"))  {
            initialUserID = extras.getString("USER_ID");
        } else {
            Toast.makeText(
                    getApplicationContext(), 
                    "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                    Toast.LENGTH_SHORT).show();
        }

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("Your Friends");

        // CAST THE GRIDVIEW
        gridOfFriends = (GridView) findViewById(R.id.gridFriends);

        // INSTANTIATE THE ARRAYLIST
        arrFriends = new ArrayList<getFriends>();

        // CAST THE ADAPTER
        adapter = new FriendsAdapter(Friends.this, arrFriends);

        // CAST THE LINEARLAYOUT THAT HOLDS THE PROGRESS BAR
        linlaProgressBar = (LinearLayout) findViewById(R.id.linlaProgressBar);
        linlaProgressBar.setVisibility(View.GONE);

        // GET THE LOGGED IN USERS FRIENDS DATA
        if (initialUserID != null)  {
            new getFriendsData().execute();
        } else {
            Toast.makeText(
                    getApplicationContext(), 
                    "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                    Toast.LENGTH_SHORT).show();
        }

        // CAST THE EDITTEXT AND SETUP FILTERING
        filterText = (EditText) findViewById(R.id.editFilterList);
        filterText.addTextChangedListener(filterTextWatcher);
    }

    private class getFriendsData extends AsyncTask<Void, Void, Void>    {

        @Override
        protected void onPreExecute() {

            // SHOW THE BOTTOM PROGRESS BAR (SPINNER) WHILE LOADING THE FRIENDS LIST
            linlaProgressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {
                String query = 
                        "SELECT name, uid, pic_big " +
                        "FROM user " +
                        "WHERE uid in " +
                        "(SELECT uid2 FROM friend WHERE uid1=me()) " +
                        "order by name";
                Bundle paramGetFriendsList = new Bundle();
                paramGetFriendsList.putString("method", "fql.query");
                paramGetFriendsList.putString("query", query);

                String resultFriendsList = Utility.mFacebook.request(paramGetFriendsList);

                JSONArray JAFriends = new JSONArray(resultFriendsList);

                getFriends friends;

                if (JAFriends.length() == 0)    {

                } else {
                    for (int i = 0; i < JAFriends.length(); i++) {
                        JSONObject JOFriends = JAFriends.getJSONObject(i);

                        friends = new getFriends();

                        // SET FRIENDS ID
                        if (JOFriends.has("uid"))   {
                            friends.setFriendID(JOFriends.getString("uid"));
                        } else {
                            friends.setFriendID(null);
                        }

                        // SET FRIENDS NAME
                        if (JOFriends.has("name"))  {
                            friends.setFriendName(JOFriends.getString("name"));
                        } else {
                            friends.setFriendName(null);
                        }

                        // SET FRIENDS PROFILE PICTURE
                        if (JOFriends.has("pic_big"))   {
                            friends.setFriendProfile(JOFriends.getString("pic_big"));
                        } else {
                            friends.setFriendProfile(null);
                        }

                        arrFriends.add(friends);

                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            // SET THE ADAPTER TO THE GRIDVIEW
            gridOfFriends.setAdapter(adapter);

            // HIDE THE BOTTOM PROGRESS BAR (SPINNER) AFTER LOADING THE FRIENDS LIST
            linlaProgressBar.setVisibility(View.GONE);
        }

    }

    private TextWatcher filterTextWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            adapter.getFilter().filter(s.toString().toLowerCase());
            adapter.notifyDataSetChanged();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };
}

The getFriends.java class for the ArrayList:

public class getFriends {

    String friendID;
    String friendName;
    String friendProfile;

    // SET FRIENDS ID
    public void setFriendID(String friendID) {
        this.friendID = friendID;
    }

    // GET FRIENDS ID
    public String getFriendID() {
        return friendID;
    }

    // SET FRIENDS NAME
    public void setFriendName(String friendName) {
        this.friendName = friendName;
    }

    // GET FRIENDS NAME
    public String getFriendName() {
        return friendName;
    }

    // SET FRIENDS PROFILE
    public void setFriendProfile(String friendProfile) {
        this.friendProfile = friendProfile;
    }

    // GET FRIENDS PROFILE
    public String getFriendProfile() {
        return friendProfile;
    }
}

And finally, the adapter class (FriendsAdapter.java)

public class FriendsAdapter extends BaseAdapter implements Filterable {

    ProgressDialog dialog;

    Activity activity;

    LayoutInflater inflater = null;
    ImageLoader imageLoader;

    ArrayList<getFriends> arrayFriends;
    List<getFriends> mOriginalNames;

    FriendsAdapter(Activity a, ArrayList<getFriends> arrFriends) {

        activity = a;

        arrayFriends = arrFriends;

        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

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

    public Object getItem(int position) {
        return arrayFriends.get(position);
    }

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

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

    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.friends_grid_items, null);

        ImageView imgProfilePicture = (ImageView) vi.findViewById(R.id.imgProfilePicture);
        TextView txtUserName = (TextView) vi.findViewById(R.id.txtUserName);
        FrameLayout mainContainer = (FrameLayout) vi.findViewById(R.id.mainContainer);


        txtUserName.setText(arrayFriends.get(position).getFriendName());

        if (arrayFriends.get(position).getFriendProfile() != null) {
            imageLoader.DisplayImage(arrayFriends.get(position).getFriendProfile(),imgProfilePicture);
        } else if (arrayFriends.get(position).getFriendProfile() == null) {
            imgProfilePicture.setVisibility(View.GONE);
        }

        mainContainer.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent showFriendsProfile = new Intent(activity.getApplicationContext(), UserProfileNew.class);
                showFriendsProfile.putExtra("USER_ID", arrayFriends.get(position).getFriendID());
                showFriendsProfile.putExtra("NAME", arrayFriends.get(position).getFriendName());
                activity.startActivity(showFriendsProfile);
            }
        });

        return vi;
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

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

                arrayFriends = (ArrayList<getFriends>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<getFriends> FilteredArrayNames = new ArrayList<getFriends>();

                if (mOriginalNames == null) {
                    mOriginalNames = new ArrayList<getFriends>(arrayFriends);
                }
                if (constraint == null || constraint.length() == 0) {
                    results.count = mOriginalNames.size();
                    results.values = mOriginalNames;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalNames.size(); i++) {
                        getFriends dataNames = mOriginalNames.get(i);
                        if (dataNames.getFriendName().toLowerCase()
                                .contains(constraint.toString())) {
                            FilteredArrayNames.add(dataNames);
                        }
                    }

                    results.count = FilteredArrayNames.size();
                    // System.out.println(results.count);

                    results.values = FilteredArrayNames;
                    // Log.e("VALUES", results.values.toString());
                }

                return results;
            }
        };

        return filter;
    }
}

You can use the concept here and substitute for your ListView. I have used this elsewhere for a ListView and works as it should. Unfortunately, I cannot give that code away on a public fora. Hope this helps you though. Again, a very lengthy post no doubt, but necessary I believe.

like image 134
Siddharth Lele Avatar answered Sep 21 '22 21:09

Siddharth Lele


check this List View with easy searching in Android

like image 31
Ram kiran Pachigolla Avatar answered Sep 22 '22 21:09

Ram kiran Pachigolla