के लिए ListView एडाप्टर के साथ कर्सर का उपयोग करके मैं SQLite डेटाबेस से डेटा प्राप्त करने और इसे सूचीदृश्य में दिखाने के लिए कस्टम कर्सर एडाप्टर का उपयोग कर रहा हूं। डेटाबेस में लगभग 8.000 पंक्तियों के साथ 2 कॉलम हैं। इसलिए मैं जितनी जल्दी हो सके सभी डेटा पूछने और दिखाने के लिए एक रास्ता तलाश रहा हूं। मैं यहाँ asyncTask साथ यह किया है कोड है:बड़ी संख्या में डेटा
private class PrepareAdapter extends AsyncTask<Void,Void,CustomCursorAdapter > {
@Override
protected void onPreExecute() {
dialog.setMessage("Wait");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
Log.e("TAG","Posle nov mAdapter");
}
@Override
protected CustomCursorAdapter doInBackground(Void... unused) {
Cursor cursor = myDbNamesHelper.getCursorQueryWithAllTheData();
mAdapter.changeCursor(cursor);
startManagingCursor(cursor);
Log.e("TIME","posle start managing Cursor" + String.valueOf(SystemClock.elapsedRealtime()-testTime)+ " ms");
testTime=SystemClock.elapsedRealtime();
mAdapter.initIndexer(cursor);
return mAdapter;
}
protected void onPostExecute(CustomCursorAdapter result) {
TabFirstView.this.getListView().setAdapter(result);
Log.e("TIME","posle adapterSet" + String.valueOf(SystemClock.elapsedRealtime()-testTime)+ " ms");
testTime=SystemClock.elapsedRealtime();
dialog.dismiss();
}
}
इस हिस्से को छोड़कर अच्छा काम करता है जब मैं एक एडाप्टर में परिणाम सेट करना होगा। मैंने कुछ समय परीक्षण किए हैं और इसे प्रारंभ करने से पहले 700 एमएस लगते हैं। प्रबंधन कर्सर। समस्या यह है कि इसे सेट एडाप्टर (परिणाम) से पहले बनाने में लगभग 7 सेकंड लगते हैं और यह यूआई थ्रेड में चल रहा है, इसलिए यह मेरे ऐप को उत्तरदायी बनाता है (प्रगति संवाद फ्रीज करता है और कभी-कभी ऐप करता है)। मैं इस बार कम कैसे कर सकता हूँ? क्या मैं इसे पृष्ठभूमि में या उत्तरदायित्व बढ़ाने के किसी भी तरीके से भी चला सकता हूं?
tnx।
public class CustomCursorAdapter extends SimpleCursorAdapter implements OnClickListener,SectionIndexer,Filterable,
android.widget.AdapterView.OnItemClickListener{
private Context context;
private int layout;
private AlphabetIndexer alphaIndexer;
public CustomCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.context = context;
this.layout = layout;
}
public void initIndexer(Cursor c){
alphaIndexer=new AlphabetIndexer(c, c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(layout, parent, false);
int nameCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME);
String name = c.getString(nameCol);
/**
* Next set the name of the entry.
*/
TextView name_text = (TextView) v.findViewById(R.id.name_entry);
if (name_text != null) {
name_text.setText(name);
}
int favCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_FAVOURITED);
int fav = c.getInt(favCol);
int idCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_ID);
Button button = (Button) v.findViewById(R.id.Button01);
button.setOnClickListener(this);
button.setTag(c.getInt(idCol));
if(fav==1){
button.setVisibility(View.INVISIBLE);
}
else button.setVisibility(View.VISIBLE);
return v;
}
@Override
public void bindView(View v, Context context, Cursor c) {
int nameCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME);
String name = c.getString(nameCol);
/**
* Next set the name of the entry.
*/
TextView name_text = (TextView) v.findViewById(R.id.name_entry);
if (name_text != null) {
name_text.setText(name);
}
int favCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_FAVOURITED);
int fav = c.getInt(favCol);
Button button = (Button) v.findViewById(R.id.Button01);
button.setOnClickListener(this);
int idCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_ID);
button.setTag(c.getInt(idCol));
// Log.e("fav",String.valueOf(fav));
if(fav==1){
button.setVisibility(View.INVISIBLE);
} else button.setVisibility(View.VISIBLE);
}
@Override
public int getPositionForSection(int section) {
return alphaIndexer.getPositionForSection(section);
}
@Override
public int getSectionForPosition(int position) {
return alphaIndexer.getSectionForPosition(position);
}
@Override
public Object[] getSections() {
return alphaIndexer.getSections();
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Log.e("item Click", arg1.toString()+ " position> " +arg2);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.Button01){
//Log.e("Button Click", v.toString()+ " position> " +v.getTag().toString());
v.setVisibility(View.INVISIBLE);
DataBaseNamesHelper dbNames = new DataBaseNamesHelper(context);
dbNames.setFavouritesFlag(v.getTag().toString());
}
}
}
क्या आपके उपयोगकर्ता वास्तव में ListView में 8000 पंक्तियों के माध्यम से स्क्रॉल करना चाहते हैं? क्या पहले सूची को फ़िल्टर करने का कोई तरीका है? – EboMike
मेरे पास इंडेक्सिंग लागू करने के साथ एक fastscroll है। और मैं फ़िल्टर करने के लिए बाद में एक खोज विकल्प जोड़ दूंगा। – DArkO
किसी भी मामले में, आप क्वेरी को एक अलग थ्रेड में कर सकते हैं और फिर एडाप्टर को असाइन कर सकते हैं, लेकिन यह अभी भी 7 सेकंड के लिए आपके ऐप को काला छोड़ देगा। जब तक आपके पास 7 सेकंड के लिए उपयोगकर्ता का मनोरंजन करने का कोई तरीका न हो? – EboMike