2016-09-22 7 views
1

この質問は既に尋ねられていますが、回答を確認しても解決策を見つけられません。これは私のアダプタです:RecyclerView:アダプターが取り付けられていない

public static class StarredReposViewHolder extends RecyclerView.ViewHolder { 
    LinearLayout starredReposLayout; 
    TextView starredRepoName; 

    public StarredReposViewHolder(View v) { 
     super(v); 
     starredReposLayout = (LinearLayout) v.findViewById(R.id.repo_starred_item_layout); 
     starredRepoName = (TextView) v.findViewById(R.id.starredepoName); 
    } 
} 

public StarredReposAdapter(List<GitHubstarredRepos> repos, int rowLayout, Context context) { 
    this.starredRepos = repos; 
    this.rowLayout = rowLayout; 
    this.context = context; 
} 

@Override 
public StarredReposAdapter.StarredReposViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false); 
    return new StarredReposViewHolder(view); 
} 


@Override 
public void onBindViewHolder(StarredReposViewHolder holder, int position) { 
    holder.starredRepoName.setText(starredRepos.get(position).getStarredName()); 
} 

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

そして、これは私がそれをロードする方法であって、onResponseの身体が正しく入力されて

public void loadStarredRepos (View view){ 

    final RecyclerView recyclerViewSt = (RecyclerView) findViewById(R.id.starred_repos_recycler_view); 
    recyclerViewSt.setLayoutManager(new LinearLayoutManager(this)); 

    GitHubStarredRepoAPI apiService = 
      ApiClient.getClient().create(GitHubStarredRepoAPI.class); 

    Call<List<GitHubstarredRepos>> call = apiService.getStarredRepoName(newString); 
    call.enqueue(new Callback<List<GitHubstarredRepos>>() { 
     @Override 
     public void onResponse(Call<List<GitHubstarredRepos>> call, Response<List<GitHubstarredRepos>> 
       response) { 

      recyclerViewSt.setAdapter(new StarredReposAdapter(response.body(), R.layout.list_item_starred_repo, 
        getApplicationContext())); 
     } 

     @Override 
     public void onFailure(Call<List<GitHubstarredRepos>> call, Throwable t) { 
      // Log error here since request failed 
      Log.e("Repos", t.toString()); 
     } 

    }); 

} 

。問題は、別のメソッドからロードされた同じ画面上に、別のリサイクルビューがあるので、onCreateで定義されているということはできません。ありがとうございました!

PS:response.body()の応答Here

+0

'response.body()'は何を返しますか? – Piyush

+0

これは、n個の要素を持つArrayListを返します。それぞれの要素はAPIから正しく取得され、ログに再度チェックインされます。 – user6456773

+0

_response.body()の回答を表示_ – Piyush

答えて

1

まあ、練習から、あなたは#onCreateでmainThreadであなたのRecyclerView番号のsetAdapter()()

public void onCreate() { recyclerViewSt.setAdapter(myAdapter); }

を持つべきですonResponse()内で更新する必要があるのは、アダプタにフィードするために使用されるデータセットです。

オブジェクトの配列(repos repos)をアクティビティのグローバル変数に返すresponse.body()を抽出することができます。同様:

List<GitHubstarredRepos> myDatasource = new ArrayList<>();

そして、それを使用する:

myAdapter = new StarredReposAdapter(myDatasource, R.layout.list_item_starred_repo, getApplicationContext()));

次に、ネットワーク呼び出しのコールバック内側:

onResponse(response) { myDatasource.clear(); myDatasource.addAll(response.body()); myRecyclerview.notifyDatasetChanged(); } ほら、私のpsedocodeコード、構文がわかりません;)

+0

Okey、すぐに試してみますが、最初のコード行はどこに書かれていますか(myAdapter = ...)、私はonResponseメソッド内でのみ_response_にアクセスできます。 – user6456773

+0

@ user6456773私の回答を更新します – toantran

+0

利用可能なonResponse内のnotifyDatasetChanged()メソッドはありません。 notify()とnotifyAll()があります。 java.lang.IllegalMonitorStateException:notify()の前にスレッドによってオブジェクトがロックされていません。修正方法を知っていますか? – user6456773

関連する問題