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.
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.
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.
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.
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.
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.
check this List View with easy searching in Android
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With