【发布时间】:2017-02-01 12:57:27
【问题描述】:
您好,我在谷歌上搜索了很长时间,但没有解决方案 我有 ListFragment 显示来自 SQlite 的数据 我想建立通过 TextChange 过滤的选项 我添加了 widjet 及其完美的工作 - 但是如何制作过滤器? getFilter().filter() 是不够的。
这是片段列表
public class CarGallery extends ListFragment {
public static final String ROW_ID = "row_id"; // Intent extra key
private int contentFrameId;
private SimpleCursorAdapter myCarSimpleCursorAdapter;
private SearchView searchView;
private SearchManager searchManager;
private Cursor cursor;
private String[] from;
private int[] to;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
contentFrameId= ((ViewGroup) getView().getParent()).getId();
// map each contact's name to a TextView in the ListView layout
from = new String[] {"number","manufacturer","model","img"};
// in file car_row.xml
to = new int[] {R.id.textViewNumber,R.id.textViewManufacturer,R.id.textViewModel,R.id.imageViewCar};
myCarSimpleCursorAdapter = new SimpleCursorAdapter(getActivity().getApplicationContext(),
R.layout.car_row, // layout to inflate it
null , // cursor adapter : if null then it will be created within the constructor
from , to , 0 );
myCarSimpleCursorAdapter.setViewBinder(new MyViewBinder());
setListAdapter(myCarSimpleCursorAdapter); //databinding --> set contactView's adapter
}
@Override
public void onResume() {
super.onResume();
// create new GetCarsTask and execute it
// our inner class
new GetCarTask().execute();// (Object[]) null
getActivity().setTitle(R.string.actionbarTitleGallery);
}
@Override
public void onStop() {
super.onStop();
cursor = myCarSimpleCursorAdapter.getCursor(); // get current Cursor
if (cursor != null)
cursor.deactivate(); // deactivate it
myCarSimpleCursorAdapter.changeCursor(null); // adapted now has no Cursor
}
////// performs database query outside GUI thread/////////////
private class GetCarTask extends AsyncTask<Void , Void , Cursor>{
DatabaseConnector databaseConnector = new DatabaseConnector(getActivity().getApplicationContext());
@Override
protected Cursor doInBackground(Void... voids) {
databaseConnector.open();
return databaseConnector.getAllCars();
}
@Override
protected void onPostExecute(Cursor result) {
myCarSimpleCursorAdapter.changeCursor(result);
databaseConnector.close();
}
}
/////// MyViewBinder Class////////////////////////////////
public class MyViewBinder implements SimpleCursorAdapter.ViewBinder {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int viewID = view.getId();
switch (viewID) {
case R.id.textViewNumber:
TextView carNumber = (TextView) view;
String car_number;
car_number = cursor.getString(cursor.getColumnIndex("number"));
carNumber.setText(car_number);
break:
case R.id.textViewManufacturer:
TextView carManufacturer = (TextView) view;
String car_manufacturer;
car_manufacturer = cursor.getString(cursor.getColumnIndex("manufacturer"));
carManufacturer.setText(car_manufacturer);
break;
case R.id.textViewModel:
TextView carModel = (TextView) view;
String car_model;
car_model = cursor.getString(cursor.getColumnIndex("model"));
carModel.setText(car_model);
break;
case R.id.imageViewCar:
ImageView carImageView = (ImageView) view;
byte[] imageBytes = cursor.getBlob(cursor.getColumnIndex("img"));
if (imageBytes != null) { carImageView.setImageBitmap(BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length));
} else {
// carImageView.setBackgroundResource(R.mipmap.ic_launcher);
}
break;
}
return true;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.search , menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
searchManager = (SearchManager)getActivity().getSystemService(Context.SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
if(searchItem != null){
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
// some opertion
return true;
}
});
searchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//some operario
}
});
EditText searchPlate = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchPlate.setHint("Search");
View searchPlateView = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); searchPlateView.setBackgroundColor(ContextCompat.getColor(getActivity(), android.R.color.transparent));
// this method for search process
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
// this method when query submitted
Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onQueryTextChange(String s) {
// this method for auto complete search process
Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show();
myCarSimpleCursorAdapter.getFilter().filter(s); return true;
}
});
}
}
}
【问题讨论】:
-
在您的
CursorAdapter中设置FilterQueryProvider -
感谢蝙蝠,我认为它没有做任何事情你知道还有其他事情要做吗
-
你从
runQuery方法返回什么? -
对不起,我不确定我是否删除了它。也许这就是问题所在。根据我的代码我应该返回什么?
标签: android fragment searchview simplecursoradapter