1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Progressbar verschwindet beim scrollen der ListActivity

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von bachmarc, 29.09.2011.

  1. bachmarc, 29.09.2011 #1
    bachmarc

    bachmarc Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    29.09.2011
    Ich habe eine ListActivity mit Views in denen ProgressBar mit fixem Wert (68kB, 20% oder so) stecken.
    Das sieht zunächst gut aus...
    Tja, scrolle ich ein dann aber Listenelement aus dem sichtbaren Bereich heraus und scrolle dann zurück ist der ProgressBar weg. Texte sind da... Balken ist weg :(

    Ich habe es nochmal geprüft... die listactivity verliert die Progressbars immer, wenn ich im Adapter dem Progressbars ein eigenes (grünes) Drawable mit setProgressDrawable() zuweise und es dann wage zu scrollen!


    Lasse ich den Progressbar auf hässlich-gelb-default ist alles ok....dann darf ich scrollen und nichts verschwindet...

    Ich muss die farbe aber ändern!
    Ideen?

    Marc
     
  2. swordi, 30.09.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ja, dazu musst du dir mal ganz genau ansehen, wie so eine ListView mit dazugehörigem Adapter funktioniert

    Die Views werden recycled. Das ist genau der Grund, warum die Bars bei dir verschwinden.
    Eine ListView mit Progressbars ist ein wenig komplizierter.

    Ich hatte sowas mal gelöst, indem ich die ListView weggelassen habe und die Zeilen selbst auf den Screen "gezeichnet" habe.

    Je nach Anwendungsfall ist das besser oder schlechter. Du musst auf jeden Fall im Adapter in der getView immer alle Werte richtig setzen.
     
  3. bachmarc, 30.09.2011 #3
    bachmarc

    bachmarc Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    29.09.2011
    Hi,
    um ehrlich zu sein ist mir die Sache nicht völlig klar...
    Ich habe einen eigenen Adapter gebaut und damit auch meine eigene getView() ausgeprägt. Ich habe mich ans Designpattern mit holder und convertView gehalten, weil ichs performant halten möchte.

    Da ich den rückgabe-View ohnehin komplett in getView() "aufblase" und fülle, verstehe ich nicht, warum der Progressbar beim zweiten Durchlauf verschwindet.
    Da wird doch auch nur noch getView gerufen und die position mitgeteilt...

    Scrolle ich was raus, sehe ich im catlog wie die GC zuschlägt... ich bin sicher da wird mein Progressbar terminiert :(

    Mhhh...
     
  4. swordi, 30.09.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    nein dein progressbar wird sicher nicht unwiderruflich gelöscht.

    füllst du beim getview die progressbar mit dem richtigen wert?

    setzt du sie auch visible ?

    wirst schon einen code posten müssen, damit wir uns das besser ansehen können
     
  5. bachmarc, 30.09.2011 #5
    bachmarc

    bachmarc Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    29.09.2011
    Hier mal meine getView()... das ganze versagt beim Scrollen immer dann, wenn ich die Methode adjustdurationBar() aufrufe.

    Ich hatte es vorher direkt in getView() und hab spasseshalber auch mal die Drawables von ProgressBar holder.durationBar durch ein gecodetes getauscht.

    ---> Beim Scrollen versagt es, nur der orginal Progressbar überlebt :(

    PHP:
    [LEFT]@Override
    public View getView(int positionView convertViewViewGroup parent) {
    ViewHolder holder;
    Script currentScript this.scriptList.get(position);

    if (
    convertView==null){
    convertView=inflator.inflate(R.layout.scriptlevelviewparentfalse);

    holder = new ViewHolder();
    holder.statusIcon = (ImageViewconvertView.findViewById(R.id.statusIcon);
    holder.scriptName = (TextViewconvertView.findViewById(R.id.scriptName);
    holder.scriptStatus = (TextViewconvertView.findViewById(R.id.scriptStatus);
    holder.durationBar = (ProgressBarconvertView.findViewById(R.id.durationBar);
    holder.scriptDuration = (TextViewconvertView.findViewById(R.id.scriptDuration);


    convertView.setTag(holder);

    } else {
    holder = (ViewHolderconvertView.getTag();
    }

    holder.scriptName.setText(currentScript.getName());
    holder.scriptStatus.setText(""currentScript.getStatus().statusCode+": "currentScript.getStatus().statusText);

    // unfortunately scrolling deletes progressbar :(
    adjustProgressBar(holder.durationBarcurrentScript.getStatus());

    holder.durationBar.setProgress(67); 
    holder.scriptDuration.setText(currentScript.getLongestExecutionDuration()+ "ms"); 
    holder.statusIcon.setImageResource(currentScript.getStatus().statusIconID);
    holder.durationBar.setVisibility(holder.durationBar.VISIBLE);
    return 
    convertView;


    }

    static class 
    ViewHolder{
    ImageView statusIcon;
    ProgressBar durationBar;
    TextView scriptDuration;
    TextView scriptName;
    TextView scriptStatus;

    }

    private 
    void adjustProgressBar(ProgressBar barExecutionStatus status){

    Resources res this.context.getResources();
    if (
    status.statusColor == ExecutionStatus.EEMGREENbar.setProgressDrawable(res.getDrawable(R.drawable.eemgreendurationbar)); 
    if (
    status.statusColor == ExecutionStatus.EEMREDbar.setProgressDrawable(res.getDrawable(R.drawable.eemreddurationbar));
    if (
    status.statusColor == ExecutionStatus.EEMGREYbar.setProgressDrawable(res.getDrawable(R.drawable.eemgreydurationbar));
    if (
    status.statusColor == ExecutionStatus.EEMYELLOWbar.setProgressDrawable(res.getDrawable(R.drawable.eemyellowdurationbar));


    }[/
    LEFT]
     
     
  6. bachmarc, 04.10.2011 #6
    bachmarc

    bachmarc Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    29.09.2011
    tja nun scheint keiner eine idee zu haben... wohl ein bug im sdk?

    Marc
     
  7. DieGoldeneMitte, 04.10.2011 #7
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Ohne jetzt tief in den Code geguckt zu haben:

    Das klingt nach dem "GUI aus falschem Thread geupdatet"-Problem.
     
  8. bachmarc, 05.10.2011 #8
    bachmarc

    bachmarc Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    29.09.2011
    Das UI ist ein Dummy... es gibt keine Threads die ich aktiv gestartet hätte.
    Der ProgressBar ist völlig statisch... er zeigt einen festen Wert.
     

Diese Seite empfehlen