Как реализовать фильтр в списке с помощью специального адаптера массива?
Я прошел через другие подобные вопросы, но я не могу найти решение. Я хочу сделать свой настраиваемый адаптер массива фильтруемым, когда пользователь нажимает последовательность клавиш.
Я новичок в этом. Пожалуйста, дайте мне знать, что я должен добавить и где.
public class ShowTags extends ListActivity {
Bundle savedInstanceState;
private final Context activityContext = this;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
new FetchTagFromDatabase().execute();
populatetagList();
}
/**
*
*/
private void populatetagList() {
ListView listView = getListView();
listView.setTextFilterEnabled(true);
OnItemClickListener listener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position,
long id) {
String tagId = (((TextView) view.findViewById(R.id.title)).getTag()).toString();
Intent intent = new Intent(activityContext, ShowPostForTag.class);
intent.putExtra("tagId", tagId);
startActivity(intent);
}
};
listView.setOnItemClickListener(listener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.show_tags_option_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh_tags:
this.onCreate(savedInstanceState);
break;
}
return true;
}
private class FetchTagFromDatabase extends AsyncTask<Void, Void, TagListAdaptor> {
private ProgressDialog dialog;
@Override
protected void onPreExecute(){
dialog = new ProgressDialog(ShowTags.this);
dialog.setCancelable(true);
dialog.setMessage("Loading...");
dialog.show();
}
@Override
protected TagListAdaptor doInBackground(Void... arg0) {
List<Tag> tags = DatabseUtil.fetchAllTags(false, ShowTags.this);
TagListAdaptor adaptor = new TagListAdaptor(ShowTags.this,R.layout.tag_row,tags);
return adaptor;
}
@Override
protected void onPostExecute(TagListAdaptor adaptor) {
setListAdapter(adaptor);
dialog.dismiss();
}
}
private class TagListAdaptor extends ArrayAdapter<Tag> implements Filterable{
private List<Tag> tags;
public TagListAdaptor(Context context,
int textViewResourceId,
List<Tag> tags) {
super(context, textViewResourceId,tags);
this.tags = tags;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.tag_row, null);
}
Tag tag = tags.get(position);
TextView titleTextView = (TextView) view.findViewById(R.id.title);
titleTextView.setText(tag.getTitle());
titleTextView.setTag(tag.getId());
Log.i("SHOW TAGS", tag.getTitle());
TextView postCountTextView = (TextView) view.findViewById(R.id.post_count);
postCountTextView.setText(((Integer)tag.getPostCount()).toString());
return view;
}
}
}
1 ответ
См. Мой блог @ http://theprogrammersvicodin.blogspot.com/2011/11/dynamic-search-in-android-database.html
Он не использует пользовательский адаптер, но вы всегда можете сделать это, расширив предварительно определенный адаптер