列表视图的搜索功能 [英] Search Functionality for Listview
问题描述
我是安卓新手.我只是想为我的应用程序制作一个简单的搜索功能.我的应用程序包含一个 ListView
一个 EditText
和一个 Button
用于搜索.我的 ListView
内容是使用扩展 BaseAdapter
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
现在,我想要做的是,我想从 ListView
中搜索任何记录例如,如果我有一些像
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...
所以,当我输入一些记录名称时,比如 op
So, when i type some record name like op
列表视图应该列出从 op...
开始的记录参考/android/widget/TextView.html#addTextChangedListener%28android.text.TextWatcher%29" rel="noreferrer">addTextChangedListener 但是,我不知道该怎么做?
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.
推荐答案
不久前我问过一个类似的问题.此处:使用 Baseadapter 过滤 ListView 过滤文本而非图像.虽然我的具体问题与 GridView 相关,但概念(和代码)可以代替 ListView.
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.
注意:这将是一篇冗长的文章,但为了完整起见,我认为这是必要的(尽管我省略了 imports
)
NOTE: This will be a lengthy post but I think necessary for the sake of completeness (I am leaving out the imports
though)
主要活动(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 并且可以正常工作.不幸的是,我不能在公共论坛上公开该代码.希望这对你有帮助.同样,毫无疑问,这是一篇很长的帖子,但我认为是必要的.
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.
这篇关于列表视图的搜索功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!