2017-08-18 9 views
0

Ich erstelle einen Listenansicht in einem Recyclerview. Ich beziehe Recyclerview mit Daten, die online abgerufen werden. Der RecyclerView füllt sich ordnungsgemäß. Ich möchte die Listenansicht zur Laufzeit füllen, wenn auf eine Schaltfläche geklickt wird. Ich definiere onClickListener für die Schaltfläche und auf Knopf klicken Ich erhalte die Daten und bevölkere einen Adapter, der auf die Listview gesetzt wird. Die Daten spiegeln sich jedoch nicht in der Listenansicht wider.ListView in einem RecyclerView

enter image description here

OnClickListener für das Button

holder.arrow_up.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
       new LoadClothes().execute(order.getOrderId()); 
     } 
    }); 

AsyncTask für das Laden von Informationen zu Listview

private class LoadClothes extends AsyncTask<String, Void, String> { 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... strings) { 
     String string = ""; 
     try { 
      Request request = new Request.Builder() 
        .url(ORDERCLOTHES) 
        .addHeader("token", BaseApplication.getToken()) 
        .addHeader("orderId", strings[0]) 
        .build(); 
      Response response = client.newCall(request).execute(); 
      string = response.body().string(); 
      Logger.d(string); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return string; 
    } 

    @Override 
    protected void onPostExecute(String string) { 
     super.onPostExecute(string); 

     Logger.d(string); 

     Gson gson = new Gson(); 
     Type type = new TypeToken<List<OrderedCloth>>() { 
     }.getType(); 
     cloths = gson.fromJson(string, type); 
     viewHolder.listView.setVisibility(ListView.VISIBLE); 
     CustomListOrderAdapter adapter = new CustomListOrderAdapter(context, cloths); 
     viewHolder.listView.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 
} 
+0

Hier können Sie versuchen, von diesem Link, [versuchen Sie diesen Link] (https://stackoverflow.com/questions/34665381/listview-inside-recyclerview-dont-scroll) –

+0

Hier können Sie versuchen, von diesem Link, versuchen Sie es link https://stackoverflow.com/questions/34665381/listview-inside-recyclerview-dont-scroll –

+0

Vielen Dank für Ihre Mühe, aber das ist eine völlig andere Frage. Ich initialisiere den Listview-Adapter zur Laufzeit. –

Antwort

0

Sind Sie sicher, dass Sie das tun wollen? Das scheint ein Designmusterproblem zu sein. Wenn Sie zusätzliche Daten anzeigen möchten, die mit einer HTTP-Anforderung abgerufen wurden, können Sie eine andere Aktivität mit den Details ausführen.

Aber Ich denke, das Problem ist der "viewHolder", wo bekommen Sie diese Variable?

Ein einfacher Weg, es scheint die AsyncTask wie das Bestehen der Listview zu lösen:

private class LoadClothes extends AsyncTask<String, Void, String> { 

    private ListView listView; 

    public LoadCloathes(ListView listView) { 
     this.listView = listView; 
    } 

    //... 

    @Override 
    protected void onPostExecute(String string) { 
     super.onPostExecute(string); 
     //mostly the same but 
     //make sure somehow listview is still available 
     listView.setAdapter... 
    } 
} 

Dann laufen die AsyncTask:

new LoadClothes(listView).execute(order.getOrderId()); 

Wie Sie eine AsyncTask sehen params im Konstruktor nehmen , die Argumente in der execute() Methode sind, den AsyncTask-Zyklus zu unterstützen, aber ist immer noch eine Java-Klasse.

+0

Vielen Dank. Es hat wie ein Zauber funktioniert. Aber ich verstehe nicht, warum das Weiterleiten von Listview durch Konstruktor funktioniert, aber eine Klassenvariable von Listview konnte nicht funktionieren. –

+0

Wegen des Recyclers.Adapter wird den ViewHolder buchstäblich recyceln, so dass es für eine andere Zeile wiederverwendet wird, dann wissen Sie nicht, wo die Ansicht tatsächlich endete. Machen Sie einen schnellen Test, indem Sie ein onCreate-Protokoll hinzufügen, und dann sehen Sie in den onBind-Methoden manchmal, dass das onCreate-Protokoll nicht vorhanden ist, aber das onBind-Protokoll. Das liegt daran, dass dieser Adapter einen Pool von Sichten erstellt. Wenn er Speicher ersparen kann, indem er eine Ansicht rettet, anstatt eine neue zu inflationieren, wird er es recyceln (das ist die Leistungsverbesserung im Vergleich zum ListView Adapter)) – cutiko

+0

Jetzt verstand ich, warum das geschah. Danke! –

Verwandte Themen