Как реализовать фильтр в списке с помощью специального адаптера массива?

Я прошел через другие подобные вопросы, но я не могу найти решение. Я хочу сделать свой настраиваемый адаптер массива фильтруемым, когда пользователь нажимает последовательность клавиш.

Я новичок в этом. Пожалуйста, дайте мне знать, что я должен добавить и где.

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

Он не использует пользовательский адаптер, но вы всегда можете сделать это, расширив предварительно определенный адаптер

Другие вопросы по тегам