我是android的新手。我只是想为我的应用程序制作一个简单的搜索功能。我的应用包含一个ListView
一个EditText
和一个Button
用于搜索。我的ListView
内容使用自定义适配器从数据库中列出,该适配器扩展为BaseAdapter
现在,我想要做的是,我想搜索来自ListView
的任何记录。例如,如果我有一些记录,如
优化,运营,数据挖掘,计算机伦理,计算机架构等......
所以,当我输入一些记录名称,如op
列表视图应该列出从op...
开始的记录我已经提到了这个,我得到addTextChangedListener但是,我不知道该怎么做?
并且,点击button
有没有人对此有任何想法?提前谢谢。
答案 0 :(得分:7)
我曾经问过一个类似的问题。在这里:Filtering a ListView with Baseadapter filters text not images。虽然,我的具体问题涉及GridView,但概念(和代码)可以替代ListView。
注意:这将是一个冗长的帖子,但我认为有必要为了完整性(我暂时忽略了imports
)
主要活动( 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) {
}
};
}
ArrayList
的 getFriends.java 类:
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;
}
}
最后,适配器类( 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;
}
}
您可以在此处使用此概念并替换ListView。我已经在其他地方使用了ListView并且可以正常工作。不幸的是,我无法在公共论坛上提供该代码。希望这会对你有所帮助。同样,一个非常冗长的帖子毫无疑问,但我认为是必要的。
答案 1 :(得分:1)
答案 2 :(得分:0)
您可以将自动填充与Edittext一起使用并使用该更新列表适配器以及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
}
});