2016-09-22 77 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()內更新的是用於提供適配器的數據集。

你可以提取你的response.body(),它返回一個對象數組(List repos)到你的活動中的一個全局變量。像:

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

相關問題