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.
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
you may use Auto completer with your Editext and using that update your List Adapter and Also see
<yourEditText>.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
<requery/filter your adapter then set it to your listview>
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});