2017-08-04 3 views
1

JSONデータをRecyclerViewリストに表示しようとしていますが、呼び出すときはいつでもRecyclerViewが空になっているようです。私はconfigViews()メソッドの前にonCreateでAPIサービス/マネージャーを取得するように設定しました。私はあまりにも早く電話をしていますか?私は問題はコールの前にビュー/アダプタを作成することだと思ったが、それは違いを生み出すようではない。ビューを構成する前に非同期呼び出しを行うことはできますか?

これはレトロフィットの呼び出しのためのコードです:

listCall.enqueue(new Callback<List<Character>>() { 
     @Override 
     public void onResponse(Call<List<Character>> call, Response<List<Character>> response) { 

      if(response.isSuccessful()){ 
       List<Character> characterList = response.body(); 

       Log.v(TAG, response.toString()); 

       for (int i = 0; i < characterList.size(); i++){ 
        Character character = characterList.get(i); 
        character.setName(characterList.get(i).getName()); 
        character.setDescription(characterList.get(i).getDescription()); 
        characterAdapter.addCharacter(character); 


       } 
       configViews(); 
       characterAdapter.notifyDataSetChanged(); 


      } 
      else { 
       int sc = response.code(); 
      } 
     } 

     @Override 
     public void onFailure(Call<List<Character>> call, Throwable t) { 

     } 
    }); 

とconfigViews()メソッドは、私が最初に(私は彼らがインフレに影響するかどうかをテストするために周りのビットを動かしてきた始めたときよりも簡単とはいえ、ここにあるものRecyclerViewの):

private void configViews() { 

    characterAdapter = new CharacterAdapter(this); 
    recyclerView.setAdapter(characterAdapter); 

} 

編集:すべてのあなたの返信をありがとう!ここで要求されるようにアダプタクラスです:原則として

public class CharacterAdapter extends 
RecyclerView.Adapter<CharacterAdapter.Holder> { 

private static final String TAG = CharacterAdapter.class.getSimpleName(); 
private final CharacterClickListener clickListener; 
private List<Character> characters; 

//Constructor for CharacterAdapter. 
public CharacterAdapter(CharacterClickListener listener){ 
    characters = new ArrayList<>(); 
    clickListener = listener; 

} 


//Inflates CardView layout 
@Override 
public Holder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View row = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, 
false); 
    return new Holder(row); 
} 

@Override 
public void onBindViewHolder(Holder holder, int position) { 

    Character currentCharacter = characters.get(position); 
    holder.name.setText(currentCharacter.getName()); 
    holder.description.setText(currentCharacter.getDescription()); 

    //Picasso loads image from URL 

Picasso.with(holder.itemView.getContext()) 
.load("http://gateway.marvel.com/"+ 
currentCharacter.getThumbnail()).into(holder.thumbnail); 

} 

@Override 
public int getItemCount() { 
    return characters.size(); 
} 

public void addCharacter(Character character) { 
    //Log.d(TAG, character.getThumbnail()); 
    characters.add(character); 
    notifyDataSetChanged(); 
} 

public Character getSelectedCharacter(int position) { 
    return characters.get(position); 
} 

public class Holder extends RecyclerView.ViewHolder implements 
View.OnClickListener{ 

    //Holder class created to be implemented by adapter. 
    private ImageView thumbnail; 
    private TextView name, description; 


    public Holder(View itemView) { 
     super(itemView); 
     thumbnail = (ImageView) 
itemView.findViewById(R.id.character_thumbnail); 
     name = (TextView) itemView.findViewById(R.id.character_name); 
     description = (TextView) 
itemView.findViewById(R.id.character_description); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 

     clickListener.onClick(getLayoutPosition()); 

    } 
} 

public interface CharacterClickListener { 
    void onClick(int position); 



} 
} 

答えて

0

あなたは正しいことを行っています。前にビューをインスタンス化し、フェッチ要求を発行することができます。応答を受け取ったら、データセットが変更されたことをアダプターに通知することができ、アダプターはビューを更新します。

唯一の修正点は、forループの前にconfigViews();に電話する必要があることです。だからあなたのコードは次のようでなければなりません - 今何が起こっているので

configViews(); 
for (int i = 0; i < characterList.size(); i++){ 
        Character character = characterList.get(i); 
        character.setName(characterList.get(i).getName()); 
        character.setDescription(characterList.get(i).getDescription()); 
        characterAdapter.addCharacter(character); 


       } 

characterAdapter.notifyDataSetChanged(); 

あなたは文字を追加使用して、すべてのデータを追加して、そのあとは、再び

characterAdapter = new CharacterAdapter(this); 

であなたのアダプタを再初期化設定のビューを呼び出しますしたがって、空のビュー。

PS:私はあなたのアダプタのaddCharacterメソッドについてはわかりませんが、正しい仕事をしたいと思っています。それでも動作しない場合は、私に知らせてからaddCharacterコードを追加してください。

+0

感謝を再オープンした

  • 更新データならばデータを表示する準備ができていることを確認してください。しかし、まだ空白になっていますが、ここにアダプターのaddCharacter()メソッドがあります: 'public void addCharacter(Character character){ //Log.d(TAG、character.getThumbnail()); 文字。追加(文字); notifyDataSetChanged(); } ' –

  • +0

    これで、文字配列をどこにアダプターに渡しますか?アダプタのgetviewメソッドでは、どうやってそれを実装しているのですか?今ではあなたのアダプタ全体のコードも必要になります。あなたの質問に追加することができます –

    +0

    質問にアダプタクラスを追加 –

    0

    スニペットのコードに基づいて、configViews()メソッドでCharacterAdapterの新しいインスタンスを作成しています。次のコードスニペットが機能します。

    ます。private void configViews(){

    //characterAdapter = new CharacterAdapter(this); 
    recyclerView.setAdapter(characterAdapter); 
    

    }

    0

    あなたはonCreateにコールconfigViews()コールを残すが、onResumeにそれの残りの部分を移動する必要があります。これは、次の達成ます:

    • ビューはアプリがバックグラウンドに持ってきて、あなたの応答を
    関連する問題