我有一个自定义的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,但我不知道我打算在这个方法中实现什么。有人可以帮我吗?或者指出一些例子的方向?
谢谢!
答案 0 :(得分:6)
我知道我需要使用runQueryOnBackgroundThread,但我不知道是什么 我打算用这种方法实现。
如果您在FilterQueryProvider
上设置CursorAdapter
,则不会覆盖该方法(默认情况下会调用runQuery
的{{1}}方法)。如果要过滤适配器,只需调用FilterQueryProvider
方法,为其提供新约束。