2016-09-22 2 views
1

Ich weiß, dass diese Frage bereits gestellt wurde, aber nachdem ich die Antworten überprüft habe, kann ich immer noch nicht die Lösung herausfinden. Das ist mein Adapter:RecyclerView: Kein Adapter angeschlossen

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(); 
} 

Und das ist die Methode, die ich es laden in:

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()); 
     } 

    }); 

} 

Der Körper onResponse richtig eingegeben wurde. Das Problem kann nicht darin bestehen, dass es in onCreate definiert ist, da ich eine andere Recycle-Ansicht auf demselben Bildschirm habe, die von einer anderen Methode geladen wurde. Vielen Dank!

PS: Die Antwort von response.body() Here

+0

Was 'response.body()' zurückgibt? – Piyush

+0

Es gibt eine ArrayList mit n Elementen zurück, jeder von ihnen hat seinen Namen korrekt aus der API übernommen, nur in den Logs erneut eingecheckt. – user6456773

+0

Zeig mir die Antwort für _response.body() _ – Piyush

Antwort

1

Nun, aus der Praxis, sollten Sie Ihre RecyclerView # setAdapter() in Mainthread in #onCreate haben()

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

Was Sie in onResponse() aktualisieren müssen, ist das DataSet, mit dem Ihr Adapter gespeist wird.

Sie können Ihre Antwort.body() extrahieren, die ein Array von Objekt (List Repos) in eine globale Variable in Ihrer Aktivität zurückgibt. Wie:

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

dann verwenden:

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

Als nächstes innerhalb des Rückrufs von Netzanruf:

onResponse(response) { myDatasource.clear(); myDatasource.addAll(response.body()); myRecyclerview.notifyDatasetChanged(); } Voila, mein psedocode Code, nicht sicher über die Syntax ;)

+0

Okey, ich werde das sofort versuchen, aber wo ist die erste Zeile Code geschrieben (myAdapter = ...) Ich habe Zugriff auf _response_ nur innerhalb der onResponse-Methode. – user6456773

+0

@ user6456773 Ich werde meine Antwort aktualisieren – toantran

+0

Es gibt keine Methode notifyDatasetChanged() innerhalb von onResponse verfügbar. Es gibt notify() und notifyAll(). Wenn einer der beiden aufgerufen wird, lautet der Fehler: java.lang.IllegalMonitorStateException: Das Objekt wurde vor dem Notify nicht vom Thread gesperrt() Haben Sie eine Idee, wie Sie es beheben können? – user6456773

Verwandte Themen