(RejectedExecutionException) Activity ruft ListAdapter mehrmals auf!!

P

padde83

Ambitioniertes Mitglied
0
Hallo und Guten Tag zusammen.

Ich arbeite gerade mit einer Kombination einer ListView und GridView und eine ViewFlipper.
Durch den ViewFlipper will ich dem Benutzer die Möglichkeit geben zwischen den beiden Views hin und her zu wechseln.

Die ListView wird als erstes geladen die XML-Struktur ist die folgende
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
<ViewFlipper android:id="@+id/viewflipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:flipInterval="15000"
    android:autoStart="false">
    <include layout="@layout/listlayout"></include>
    <include layout="@layout/gridlayout"></include>
    </ViewFlipper>
</LinearLayout>
In meiner Activity gehe ich so vor:
Code:
..
@Override
    protected void onCreate(Bundle savedInstanceState)

ListView listView = (ListView) findViewById(R.id.list);
        listView.setClickable(true);
        listView.setAdapter(new ListAdapter(Activity.this, "oben genanntes Schema", elements)); //Enthält eine ArrayList mit elementen
        listView.setOnScrollListener(new OnScrollListener(Activity.this));
        listView.setOnItemClickListener(new OnItemClickListener()); //

GridView gridView = (GridView) findViewById(R.id.grid);
        gridView.setClickable(true);
        gridView
                .setAdapter(new GridAdapter(Activity.this, "oben genanntes Schema", elements));  //Enthält eine ArrayList mit elementen
        gridView.setOnItemClickListener(new OnItemClickListener(Activity.this));
Die Adapter für beide Views habe ich angepasst.
Code:
public class ListAdapter extends ArrayAdapter<T>{
public ListAdapter(Context context, int viewId, List<T> objects)
    {
        super(context, viewId, objects);
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (convertView != null)
        {
            layout = (LinearLayout) convertView;
        }
        else
        {
            layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.listlayout, parent, false);
        }
}
.... usw. start asyncTask
}

Nun zu meinem Problem:

In der Activity werden die Adapter für die jeweiligen Views mehrmals direkt hintereinander aufgerufen.:(
Normal sollte es ja so sein, dass einmal der ListAdapter und einmal der GridAdapter aufgerufen wird.:confused:

Dies ist leider nicht der fall beide werden auch wenn nur ein Element in der Liste enthalten ist 4-6x aufgerufen.

Normal ist dies ja kein Problem aber im Adapter starte ich einen AsyncTask der somit auch unnötig oft aufgerufen wird.
Das führt zu einer RejectedExecutionException, wenn sich mehrere Elemente in der Liste befinden.:mad:

Ist es irgendwie möglich dies zu Unterbinden. Oder habe ich die Implementierung des Adapters falsch verstanden?:cool:

Gruß & Danke:)
padde83
 
Anscheinend ist die maximale Anzahl von Tasks auf 10 limitiert.:mad:

Gibt es eine Möglichkeit diese Anzahl zu erhöhen?
Durch Recherchen bin ich auf den ThreadPoolExecutor gestoßen, mit dem man
setMaximumPoolSize(int) aufrufen kann.

Hat jmd. schon etwas Erfahrung mit? Nen Plan wo ich das genau aufrufen soll hab ich nun nicht! :D

Gruß
padde83
 
Guten Morgen.:)

Habe das oben genannte Beispiel mal etwas modifiziert.
Ich habe das Laden der ListView bzw. der GridView in ein Buttonevent gepackt.
Und siehe da es wird alles so ausgeführt wie es soll. :confused:

Code:
button.setOnClickListener(new Button.OnClickListener()
        {

            public void onClick(View v){
listView.setAdapter(....)); 
gridView.setAdapter(...));
}
Nun verstehe ich aber immer noch nicht warum es hier genau 1x mal (Ok halt nur bei ButtonEvent) und ohne Button beim Start der Activity(in onCreate) gleich 5-6 mal aufgerufen wird. :mad:

Gruß & Danke
padde83
 
So konnte das Problem etwas eingrenzen.
Anscheinend wird der Adapter nicht 5 mal aufgerufen sondern die getView-Methode.

Mein Adapter:
Code:
public class MyListAdapter extends ArrayAdapter<T>{

  public MyListAdapter(Context context, int viewId, List<T> objects){
   super(context, viewId, objects);
  }

@Override
public View getView(int position, View convertView, ViewGroup parent){
LinearLayout layout;

        if (convertView != null)
        {
            layout = (LinearLayout) convertView;
        }
        else
        {
            layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.list_view, parent, false);
        }

return layout;
}
Warum wird die getView-Methode 5 mal aufgerufen. Ich verstehs net.:mad:

Hoffe irgendjemand hat nen Anhaltspunkt!!

padde83
 
Eine pure Alleinunterhaltung hat auch sein Vorteile. Habe das Problem gelöst.:D

Lösung:
ListView und layout_height="wrap_content" vertragen sicht nicht. Mit wrap_content ist die ListView dazu gezwungen die höhe und die weite für jedes element neu zu berechnen was zu einem erneuten Aufruf von getView führt. Einfach wrap_content durch fill_parent ersetzten und schon wird getView nicht mehrmals aufgerufen.

gruß
padde83
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
112
swa00
swa00
B
Antworten
4
Aufrufe
470
bb321
B
M
  • maksimilian
Antworten
15
Aufrufe
1.694
maksimilian
M
Zurück
Oben Unten