BlackDroid
- Forum-Beiträge: 18
26.10.2011, 14:56:23 via Website
26.10.2011 14:56:23 via Website
Hallo zusammen,
ich bin etwas verwirrt bzw. bin ich mir bei folgender Sache unsicher. Ich binde einen eigenen bzw. erweiterten CursorAdapter an eine ListView (ListFragment). Die Daten werden über einen erweiterten AsyncTaskLoader (LoaderManager) abgeholt und dann dem Adapter übergeben.
Ich nutze das Android Comp. Package v4.
Durch den AsyncTaskLoader werden die Daten im Hintergrund abgeholt - somit läuft der Vorgang nicht im UI Thread...also sicher.
Wo ich mir nicht sicher bin ist bei meinen View Objekten in der Liste - in meinem Buch steht beschrieben das man seine View-Objekte recyclen soll bzw. diese sollen in einem ViewHolder Objekt gespeichert werden. Das soll den Speicherbedarf und die Darstellung in der Liste verbessern - da die Referenzierung via findViewById nur einmal passiert, und danach eben im ViewHolder gespeichert wird. siehe Abschnitt Performance
http://de.wikibooks.org/wiki/Googles_Android_-_Lehrbuch_zur_Programmierung:_ListActivity
Allerdings beziehen sich diese Beispiele immer auf die Ableitung vom Typ BaseAdapter bzw. überschreiben der Methode getView()
Beim Ableiten von der Klasse CursorAdapter kümmerst sich anscheinend das Framework um das recyceln der Views:
http://codereview.stackexchange.com/questions/1057/android-custom-cursor-adapter-design
http://stackoverflow.com/questions/4567969/viewholder-pattern-correctly-implemented-in-custom-cursoradapter
Allerdings wird doch bei jedem bindView() erneut die findViewById()-Methode aufgerufen - also wo ist da der Unterschied bzw. warum kann ich mir in diesem Fall das recyclen sparen? Das würde ich gerne verstehen....
Als Newbie bin ich für jegliche Kritik sowieso immer offen - hoffe das die Umsetzung so sauber ist.
Viele Grüße
ich bin etwas verwirrt bzw. bin ich mir bei folgender Sache unsicher. Ich binde einen eigenen bzw. erweiterten CursorAdapter an eine ListView (ListFragment). Die Daten werden über einen erweiterten AsyncTaskLoader (LoaderManager) abgeholt und dann dem Adapter übergeben.
Ich nutze das Android Comp. Package v4.
Durch den AsyncTaskLoader werden die Daten im Hintergrund abgeholt - somit läuft der Vorgang nicht im UI Thread...also sicher.
Wo ich mir nicht sicher bin ist bei meinen View Objekten in der Liste - in meinem Buch steht beschrieben das man seine View-Objekte recyclen soll bzw. diese sollen in einem ViewHolder Objekt gespeichert werden. Das soll den Speicherbedarf und die Darstellung in der Liste verbessern - da die Referenzierung via findViewById nur einmal passiert, und danach eben im ViewHolder gespeichert wird. siehe Abschnitt Performance
http://de.wikibooks.org/wiki/Googles_Android_-_Lehrbuch_zur_Programmierung:_ListActivity
Allerdings beziehen sich diese Beispiele immer auf die Ableitung vom Typ BaseAdapter bzw. überschreiben der Methode getView()
Beim Ableiten von der Klasse CursorAdapter kümmerst sich anscheinend das Framework um das recyceln der Views:
http://codereview.stackexchange.com/questions/1057/android-custom-cursor-adapter-design
http://stackoverflow.com/questions/4567969/viewholder-pattern-correctly-implemented-in-custom-cursoradapter
1public class EnMeterListingFragment extends ListFragment
2implements LoaderManager.LoaderCallbacks<Cursor> {
3
4 private EnMeterListingAdapter mEnMeterListingAdapter;
5
6 @Override
7 public void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9
10 getLoaderManager().initLoader(0, null, this);
11 mEnMeterListingAdapter = new EnMeterListingAdapter(getActivity().getApplicationContext(), null);
12 setListAdapter(mEnMeterListingAdapter);
13 }
14 public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
15 return new EnMeterLoader(getActivity());
16 }
17
18 public void onLoadFinished(Loader<Cursor> loader, Cursor _cursor) {
19 mEnMeterListingAdapter.changeCursor(_cursor);
20 }
21
22 public void onLoaderReset(Loader<Cursor> loader) {
23 mEnMeterListingAdapter.changeCursor(null);
24 }
25}
2implements LoaderManager.LoaderCallbacks<Cursor> {
3
4 private EnMeterListingAdapter mEnMeterListingAdapter;
5
6 @Override
7 public void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9
10 getLoaderManager().initLoader(0, null, this);
11 mEnMeterListingAdapter = new EnMeterListingAdapter(getActivity().getApplicationContext(), null);
12 setListAdapter(mEnMeterListingAdapter);
13 }
14 public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
15 return new EnMeterLoader(getActivity());
16 }
17
18 public void onLoadFinished(Loader<Cursor> loader, Cursor _cursor) {
19 mEnMeterListingAdapter.changeCursor(_cursor);
20 }
21
22 public void onLoaderReset(Loader<Cursor> loader) {
23 mEnMeterListingAdapter.changeCursor(null);
24 }
25}
1public class EnMeterListingAdapter extends CursorAdapter {
2 private final LayoutInflater mInflater;
3
4 public EnMeterListingAdapter(Context _context, Cursor _cursor) {
5 super(_context, _cursor);
6 mInflater = LayoutInflater.from(_context);
7 }
8
9 @Override
10 public View newView(Context _context, Cursor _cursor, ViewGroup _parent) {
11 final View view = mInflater.inflate(R.layout.enmeter_listing_item, _parent, false);
12 return view;
13 }
14
15 @Override
16 public void bindView(View _convertView, Context _context, Cursor _cursor) {
17
18 TextView txt_enmeter_listing_inst_point = (TextView) _convertView.findViewById(R.id.txt_enmeter_listing_inst_point);
19 TextView txt_enmeter_listing_mpname = (TextView) _convertView.findViewById(R.id.txt_enmeter_listing_mpname);
20
21 txt_enmeter_listing_inst_point.setText(_cursor.getString(_cursor.getColumnIndex(EnMeterTable.InstallationPoint)));
22 txt_enmeter_listing_mpname.setText(_cursor.getString(_cursor.getColumnIndex(EnMeterTable.MPName)));
23 }
2 private final LayoutInflater mInflater;
3
4 public EnMeterListingAdapter(Context _context, Cursor _cursor) {
5 super(_context, _cursor);
6 mInflater = LayoutInflater.from(_context);
7 }
8
9 @Override
10 public View newView(Context _context, Cursor _cursor, ViewGroup _parent) {
11 final View view = mInflater.inflate(R.layout.enmeter_listing_item, _parent, false);
12 return view;
13 }
14
15 @Override
16 public void bindView(View _convertView, Context _context, Cursor _cursor) {
17
18 TextView txt_enmeter_listing_inst_point = (TextView) _convertView.findViewById(R.id.txt_enmeter_listing_inst_point);
19 TextView txt_enmeter_listing_mpname = (TextView) _convertView.findViewById(R.id.txt_enmeter_listing_mpname);
20
21 txt_enmeter_listing_inst_point.setText(_cursor.getString(_cursor.getColumnIndex(EnMeterTable.InstallationPoint)));
22 txt_enmeter_listing_mpname.setText(_cursor.getString(_cursor.getColumnIndex(EnMeterTable.MPName)));
23 }
Allerdings wird doch bei jedem bindView() erneut die findViewById()-Methode aufgerufen - also wo ist da der Unterschied bzw. warum kann ich mir in diesem Fall das recyclen sparen? Das würde ich gerne verstehen....
Als Newbie bin ich für jegliche Kritik sowieso immer offen - hoffe das die Umsetzung so sauber ist.
Viele Grüße
— geändert am 26.10.2011, 15:10:43
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.