2017-06-26 18 views
1

私はRecyclerViewに関連する問題を解決しようとしています。最初にオブジェクトのリストを表示しようとすると、何も表示されません。データは、非同期であることが知られているボレーの要求のために渡されます。ですから、私はonDataSetChanged()のようなさまざまなソリューションを試しましたが、何も起こりません。私は解決策が機能することを言いたい、私は何の問題もなくそれを見ることができるリストを見て二回目。ここでRecyclerViewはすぐに何も表示しません

は私のコードです:

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; 
} 

はあなたの助けをありがとう!

+0

どのようにデータを「アダプタ」に渡していますか? 'notifyDataSetChanged'を呼び出すだけで、APIから受け取ったばかりのデータはアダプタに送られません。 – Apoorv

+0

私は、この呼び出しでデータが渡されると考えていました:adapter = new MyAdapter(this、initData()); 。そうじゃない? – BigMeister

+0

'onResponse'にあなたのアドパターを設定する必要があります。そうすれば、データが取得されたらリサイクルビューを膨らませることができます。非同期のonCreateは、データロードが完了したときを知らないため、 –

答えて

1

はよくポイントのカップル

  1. 作らボレー要求の後に空のリストを返すGETリスト方法があります。
  2. リストのデータがサーバーから入力されていることを確認してから、セットデータを呼び出します。

次のように試してみる必要があります。

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

何が変更されたのか、なぜそれが明確ではないのですか。あなたのコード例に沿ってOPが間違っていたことに言及してみてください – Doomsknight

+1

ビンゴ!応答が機能した後にアダプタを移動する!上記の解決策は完璧ではありませんが、改造はほとんどありません。本当にありがとう! – BigMeister

+0

私の意図は、正しい流れを示してくれたことに感謝します。 – Sush

関連する問題