2016-09-22 55 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

相关问题