#android #sqlite #android-fragments #android-asynctask
#Android #sqlite #android-фрагменты #android-asynctask
Вопрос:
У меня есть фрагмент с listview и задаю в нем данные с помощью запроса. Как я могу выполнять операции с базой данных для выбора, а затем устанавливать данные с помощью asynctask для реализации индикатора выполнения при выборе фрагмента в панели навигации?
Это мой фрагмент:
public class FragmentOne extends Fragment {
ListView lv;
MyAdapter myAdapter;
SearchView sv;
ArrayList<MyObject> listMyObject;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
sv = (SearchView) getView().findViewById(R.id.searchView);
lv = (ListView) getView().findViewById(R.id.listView);
setData("");
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
setData(newText);
return false;
}
});
}
public void setData(String params) {
String query = "select *, count(*) as num from table where field_1 like '" params "%' group by field_1 order by field_1";
listMyObject= new ArrayList<>();
DBHelper dbHelper;
SQLiteDatabase sqLiteDatabase;
String ... ;
int ...;
dbHelper = DBHelper.getInstance(getActivity().getApplicationContext());
sqLiteDatabase = dbHelper.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(query, null);
if (cursor.getCount() > 0) {
if (cursor.moveToFirst()) {
do {
...
listMyObject.add(new MyObject(...));
} while (cursor.moveToNext());
}
}
arrayAdapter = new MyAdapter(getActivity(), R.layout.listview_row, listMyObject);
lv.setAdapter(myAdapter);
dbHelper.close();
}
Заранее спасибо.
Ответ №1:
Попробуйте что-то вроде этого:
public void setData(final String params){
new AsyncTask<Void, Void, List<MyObject>>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
// show progress bar on main thread
showProgressBar();
}
@Override
protected List<Object> doInBackground(Void... params) {
// fetch data in background
String query = "select *, count(*) as num from table where field_1 like '" params "%' group by field_1 order by field_1";
listMyObject = new ArrayList<>();
DBHelper dbHelper = DBHelper.getInstance(getActivity().getApplicationContext());
SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(query, null);
if (cursor.getCount() > 0) {
if (cursor.moveToFirst()) {
do {
...
listMyObject.add(new MyObject(...));
} while (cursor.moveToNext());
}
}
dbHelper.close();
return listMyObject;
}
@Override
protected void onPostExecute(List<MyObject> objects) {
super.onPostExecute(objects);
// set adapter and hide progress bar on main thread
arrayAdapter = new MyAdapter(getApplication(), R.layout.listview_row, listMyObject);
lv.setAdapter(myAdapter);
hideProgressBar();
}
}.execute();
}