Progressbar verschwindet beim scrollen der ListActivity

B

bachmarc

Neues Mitglied
0
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
 
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.
 
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...
 
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
 
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 position, View convertView, ViewGroup parent) {
ViewHolder holder;
Script currentScript = this.scriptList.get(position);

if (convertView==null){
convertView=inflator.inflate(R.layout.scriptlevelview, parent, false);

holder = new ViewHolder();
holder.statusIcon = (ImageView) convertView.findViewById(R.id.statusIcon);
holder.scriptName = (TextView) convertView.findViewById(R.id.scriptName);
holder.scriptStatus = (TextView) convertView.findViewById(R.id.scriptStatus);
holder.durationBar = (ProgressBar) convertView.findViewById(R.id.durationBar);
holder.scriptDuration = (TextView) convertView.findViewById(R.id.scriptDuration);


convertView.setTag(holder);

} else {
holder = (ViewHolder) convertView.getTag();
}

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

// unfortunately scrolling deletes progressbar :(
adjustProgressBar(holder.durationBar, currentScript.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 bar, ExecutionStatus status){

Resources res = this.context.getResources();
if (status.statusColor == ExecutionStatus.EEMGREEN) bar.setProgressDrawable(res.getDrawable(R.drawable.eemgreendurationbar)); 
if (status.statusColor == ExecutionStatus.EEMRED) bar.setProgressDrawable(res.getDrawable(R.drawable.eemreddurationbar));
if (status.statusColor == ExecutionStatus.EEMGREY) bar.setProgressDrawable(res.getDrawable(R.drawable.eemgreydurationbar));
if (status.statusColor == ExecutionStatus.EEMYELLOW) bar.setProgressDrawable(res.getDrawable(R.drawable.eemyellowdurationbar));


}[/LEFT]
 
tja nun scheint keiner eine idee zu haben... wohl ein bug im sdk?

Marc
 
Ohne jetzt tief in den Code geguckt zu haben:

Das klingt nach dem "GUI aus falschem Thread geupdatet"-Problem.
 
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.
 

Ähnliche Themen

S
  • Sempervivum
Antworten
2
Aufrufe
607
Sempervivum
S
M
Antworten
3
Aufrufe
161
moin
M
M
Antworten
2
Aufrufe
629
Mozart40
M
Zurück
Oben Unten