CursorAdapter实现了Filterable

时间:2013-01-25 15:06:50

标签: android android-listview android-cursoradapter

我有一个自定义的CursorAdapter类,它使用字母索引器,我想实现可过滤,但我遇到一些问题让它正常运行。

    c = db.selectData();


    lv = (ListView) findViewById(android.R.id.list);
    searchTerm = (EditText) findViewById(R.id.inputSearch);

    lv.setFastScrollEnabled(true);

    adapter = new MyCursorAdapter(getApplicationContext(), R.layout.rowlayout, c, new String[]{"_id, name, company, job_title"},
            new int[]{R.id.company, R.id.job_title, R.id.name});

    adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            // Search for states whose names begin with the specified letters.
            Cursor cursor = db.searchAttendees(constraint.toString());
            return cursor;

        }
    });

    lv.setAdapter(adapter);

    getListView().setTextFilterEnabled(true);

    searchTerm.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            System.out.println("Text ["+s+"]");
            adapter.getFilter().filter(s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

  }

这是MyCustomAdapter类

        public class MyCursorAdapter extends CursorAdapter  implements SectionIndexer, Filterable
{

    AlphabetIndexer mAlphabetIndexer;

    public MyCursorAdapter(Context context, int simpleListItem1,
            Cursor cursor, String[] strings, int[] is)
    {
        super(context, cursor);
        mAlphabetIndexer = new AlphabetIndexer(cursor,
                cursor.getColumnIndex("name"),
                " ABCDEFGHIJKLMNOPQRTSUVWXYZ");
        mAlphabetIndexer.setCursor(cursor);//Sets a new cursor as the data set and resets the cache of indices.

    }

    /**
     * Performs a binary search or cache lookup to find the first row that matches a given section's starting letter.
     */
    @Override
    public int getPositionForSection(int sectionIndex)
    {
        return mAlphabetIndexer.getPositionForSection(sectionIndex);
    }

    /**
     * Returns the section index for a given position in the list by querying the item and comparing it with all items
     * in the section array.
     */
    @Override
    public int getSectionForPosition(int position)
    {
        return mAlphabetIndexer.getSectionForPosition(position);
    }

    /**
     * Returns the section array constructed from the alphabet provided in the constructor.
     */
    @Override
    public Object[] getSections()
    {
        return mAlphabetIndexer.getSections();
    }

    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        //What to do here?

    }

    /**
     * Bind an existing view to the data pointed to by cursor
     */
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView name = (TextView)view.findViewById(R.id.name);
        name.setText(cursor.getString(
                cursor.getColumnIndex("name")));
        TextView company = (TextView)view.findViewById(R.id.company);
        company.setText(cursor.getString(
                cursor.getColumnIndex("company")));
        TextView jobTitle = (TextView)view.findViewById(R.id.job_title);
        jobTitle.setText(cursor.getString(
                cursor.getColumnIndex("job_title")));
    }

    /**
     * Makes a new view to hold the data pointed to by cursor.
     */
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View newView = inflater.inflate(
                R.layout.attendee_item_row, parent, false);
        return newView;
    }

我知道我需要使用runQueryOnBackgroundThread,但我不知道我打算在这个方法中实现什么。有人可以帮我吗?或者指出一些例子的方向?

谢谢!

1 个答案:

答案 0 :(得分:6)

  

我知道我需要使用runQueryOnBackgroundThread,但我不知道是什么   我打算用这种方法实现。

如果您在FilterQueryProvider上设置CursorAdapter,则不会覆盖该方法(默认情况下会调用runQuery的{​​{1}}方法)。如果要过滤适配器,只需调用FilterQueryProvider方法,为其提供新约束。