2

アルファベット インデクサーを使用するカスタム CursorAdapter クラスがあり、filterable を実装したいのですが、正しく機能させるのに問題があります。

    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 を使用する必要があることはわかっていますが、このメソッドで何を実装するつもりなのかわかりません。誰かがここで私を助けてくれますか? または、いくつかの例の方向を教えてください。

ありがとう!

4

1 に答える 1

6

runQueryOnBackgroundThread を使用する必要があることはわかっていますが、このメソッドで何を実装するつもりなのかわかりません。

に を設定するFilterQueryProviderと、CursorAdapterそのメソッドをオーバーライドしません (デフォルトでは のrunQueryメソッドを呼び出しますFilterQueryProvider)。アダプタをフィルタリングする場合getFilter().filter(constraint)は、新しい制約を指定してメソッドを呼び出すだけです。

于 2013-01-25T15:49:23.357 に答える