2016-06-25 8 views
0

通常、Toastメッセージのデータを取得して表示できますが、RecyclerViewに追加することはできません。これどうやってするの?私を助けてください。ありがとう。私は以下のコードを共有しています。AndroidでRetrofitを使用してRecyclerViewにデータを設定できない

NewsCatalog.java

public class NewsCatalog { 
public List<MainNodes> nodes; 

}

MainNodes.java

public class MainNodes { 
public SubNodes node; 

}

SubNodes.java

public class SubNodes { 
public String body; 

public String getBody() { 
    return body; 
} 

public void setBody(String body) { 
    this.body = body; 
} 

}

NewsInterface

public interface NewsService { 
String BASE_URL = "http://test.muhabirce.de/app/term/"; 

@GET("saglik") 
Call<NewsCatalog> newsCatalog(); 

}

Adapter.java

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { 

private ArrayList<SubNodes> subNodes; 
private Context context; 

public NewsAdapter(ArrayList<SubNodes> subNodes, Context context) { 
    this.subNodes = subNodes; 
    this.context = context; 
} 

@Override 
public NewsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context) 
      .inflate(R.layout.card_view_items, parent, false); 

    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(NewsAdapter.ViewHolder holder, int position) { 
    holder.tvText.setText(subNodes.get(position).getBody()); 
} 

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

public class ViewHolder extends RecyclerView.ViewHolder { 

    private TextView tvText; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     tvText = (TextView) itemView.findViewById(R.id.tvText); 
    } 
} 

}

MainActivity.java

あなたが再新しいサブノードオブジェクトを作成しないでください
private void bindDatas() { 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(NewsService.BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    NewsService newsService = retrofit.create(NewsService.class); 
    Call<NewsCatalog> requestCatalog = newsService.newsCatalog(); 


    requestCatalog.enqueue(new Callback<NewsCatalog>() { 
     @Override 
     public void onResponse(Call<NewsCatalog> call, Response<NewsCatalog> response) { 
      SubNodes subNodess = new SubNodes(); 
      if (!response.isSuccessful()) { 
       Log.i("TAG", "Error: " + response.code()); 
      } else { 
       NewsCatalog catalog = response.body(); 
       try { 
        for (MainNodes m : catalog.nodes 
          ) { 
         subNodess.setBody(m.node.body); 
        } 
       } catch (Exception e) { 
        Log.i(TAG, "" + e.getMessage()); 
       } 
      } 

      subNodes.add(subNodess); 
      adapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onFailure(Call<NewsCatalog> call, Throwable t) { 
      Log.e(TAG, "Error: " + t.getMessage()); 
     } 
    }); 
} 

}

+0

あなたのリクエストのどこでも「実行」を呼び出していますか? –

+0

いいえ、bindData()メソッドで呼び出す必要がありますか? @IvanWooll – nuhkoca

+0

謝罪、私はRetrofit2の仕組みを誤解していました。 requestCatalog.enqueueは呼び出しを実行する必要があります。あなたがあなたが期待しているものにサーバーから戻ってくる応答を比較するために行ったデバッグは何ですか? –

答えて

0

スポンサーコールバック。アダプタにはこのオブジェクトへの参照がないため、データの変更は反映されません。 recyclerviewアダプタのサブノードオブジェクトを更新します。その後、notifyDataSetChanged()だけがデータの変更を反映します。

+0

質問を編集できますか? @ user3215142 – nuhkoca

+0

なぜですか?あなたは私の答えを理解していないか、あなたの質問が間違っていませんか? – user3215142

+0

いいえ、私はこのトピックを初めて知りました。私はちょっと混乱しています。しかし、私は試してみる。ありがとう@ user3215142 – nuhkoca

関連する問題