2017-06-26 11 views
1

Ich versuche, ein Problem im Zusammenhang mit RecyclerView zu beheben. Wenn ich versuche, die Objektliste zum ersten Mal zu zeigen, sehe ich nichts. Die Daten werden dank einer Volley-Anforderung übergeben, die async bekannt ist. Also habe ich verschiedene Lösungen wie onDataSetChanged() versucht, aber nichts passiert. Ich möchte bemerken, dass die Lösung funktioniert, das zweite Mal, wenn ich die Liste sehe, kann ich es ohne Probleme sehen.RecyclerView zeigt nichts sofort

Hier ist mein Code:

public class MainActivity extends AppCompatActivity { 

RecyclerView recyclerView; 

private static MyAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
    getSupportActionBar().setHomeButtonEnabled(false); 

    recyclerView = (RecyclerView) findViewById(R.id.myRecyclerView); 
    adapter = new MyAdapter(this,initData()); 
    adapter.setParentClickableViewAnimationDefaultDuration(); 
    adapter.setParentAndIconExpandOnClick(true); 

    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    recyclerView.setAdapter(adapter); 
} 

private List<ParentObject> initData() { 
    TitleCreator titleCreator = TitleCreator.get(this); 
    List<TitleParent> titles = titleCreator.getAll(); 
    List<ParentObject> parentObject = new ArrayList<>(); 

    for(TitleParent title:titles) 
    { 
     List<Object> childList = getList(title); 
     title.setChildObjectList(childList); 
     parentObject.add(title); 
    } 

    return parentObject; 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    ((MyAdapter)recyclerView.getAdapter()).onSaveInstanceState(outState); 
} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    overridePendingTransition(R.anim.left_enter, R.anim.right_out); 
} 

private List<Object> getList(final TitleParent title){ 
    final List<Object> childList = new ArrayList<>(); 

    // Tag used to cancel the request 
    String tag_string_req = "request"; 

    StringRequest strReq = new StringRequest(Request.Method.POST, 
      AppConfig.URL_DASHBOARD, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.d("POL", "Response: " + response.toString()); 

      try { 
       JSONObject jObj = new JSONObject(response); 

       for (int i = 0; i < jObj.getJSONArray("polizze").length(); i++) { 
        JSONObject user = jObj.getJSONArray("polizze").getJSONObject(i); 
        String certificate = user.getString("numero_contratto"); 
        if(title.getTitle().contains(certificate)){ 
         String scadenza = user.getString("scadenza"); 
         String totale = user.getString("totale"); 
         childList.add(new TitleChild(scadenza,totale)); 
        } 
       } 
       Log.d("TRY", "Response: " + response.toString()); 
       adapter.notifyDataSetChanged(); 
      } catch (JSONException e) { 
       // JSON error 
       e.printStackTrace(); 
       // Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("DASH", "Login Error: " + error.getMessage()); 
      //Toast.makeText(getApplicationContext(), 
      //  error.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 

    return childList; 
} 

Vielen Dank für Ihre Hilfe!

+0

Wie geben Sie die Daten zu 'adapter'? Wenn Sie nur 'notifyDataSetChanged' aufrufen, werden die Daten, die Sie gerade von der API erhalten haben, nicht an den Adapter gesendet. – Apoorv

+0

Ich dachte, dass Daten durch diesen Aufruf übergeben werden: adapter = new MyAdapter (this, initData()); . Es ist nicht wahr, oder? – BigMeister

+0

Sie müssen Ihren Adapter in 'onResponse' einstellen, damit er die Recycleransicht aufbläht, sobald die Daten abgerufen wurden. Da es async ist, würde onCreate nicht wissen, wann das Laden der Daten beendet ist. –

Antwort

1

gut gibt es einige Punkte

  1. get list-Methode leere Liste nach gemacht Volley Anfrage zurück.
  2. stellen Sie sicher, dass die Liste mit Daten vom Server gefüllt ist, und rufen Sie dann die Set-Daten auf.

müssen Sie etwas wie unten versuchen.

public class MainActivity extends AppCompatActivity { 

RecyclerView recyclerView; 

private static MyAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
    getSupportActionBar().setHomeButtonEnabled(false); 

    recyclerView = (RecyclerView) findViewById(R.id.myRecyclerView); 
    // show some loading bar 
    initData(); 

} 

    private void initData() { 
    TitleCreator titleCreator = TitleCreator.get(this); 
    List<TitleParent> titles = titleCreator.getAll(); 
    List<ParentObject> parentObject = new ArrayList<>(); 

    for(TitleParent title:titles) 
    { 
     List<Object> childList = getList(title); 
     title.setChildObjectList(childList); 
     parentObject.add(title); 
    } 


} 
private void setData(List<ParentObject> parentObject) { 
// load the data here    
    adapter = new MyAdapter(this,parentObject); 
      adapter.setParentClickableViewAnimationDefaultDuration(); 
adapter.setParentAndIconExpandOnClick(true); 

recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
recyclerView.setAdapter(adapter); 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    ((MyAdapter)recyclerView.getAdapter()).onSaveInstanceState(outState); 
} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    overridePendingTransition(R.anim.left_enter, R.anim.right_out); 
} 

private List<Object> getList(final TitleParent title){ 
    final List<Object> childList = new ArrayList<>(); 

    // Tag used to cancel the request 
    String tag_string_req = "request"; 

    StringRequest strReq = new StringRequest(Request.Method.POST, 
      AppConfig.URL_DASHBOARD, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.d("POL", "Response: " + response.toString()); 

      try { 
       JSONObject jObj = new JSONObject(response); 

       for (int i = 0; i < jObj.getJSONArray("polizze").length(); i++) { 
        JSONObject user = jObj.getJSONArray("polizze").getJSONObject(i); 
        String certificate = user.getString("numero_contratto"); 
        if(title.getTitle().contains(certificate)){ 
         String scadenza = user.getString("scadenza"); 
         String totale = user.getString("totale"); 
         childList.add(new TitleChild(scadenza,totale)); 
        } 
       setData(childList); 
       } 
       Log.d("TRY", "Response: " + response.toString()); 

      } catch (JSONException e) { 
       // JSON error 
       e.printStackTrace(); 
       // Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("DASH", "Login Error: " + error.getMessage()); 
      //Toast.makeText(getApplicationContext(), 
      //  error.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 

    return childList; 
} 
+1

Es ist nicht klar, was sich geändert hat und warum. Erwähnen Sie, was mit dem OP an der Seite Ihres Codebeispiels falsch war. – Doomsknight

+1

Bingo! Verschieben des Adapters nach der Antwort! Die obige Lösung ist nicht perfekt, aber mit kleinen Mods funktioniert jetzt perfekt. Wirklich danke! – BigMeister

+0

danke meine intentionen war zeigen sie richtigen fluss. – Sush