2016-10-30 3 views
0
senden

Ich habe eine ArrayList und die Liste erhält Daten von Retrofit und seine Arbeit gut. Das Problem ist, wenn ich versuche, die Liste an RecyclerView Adapter zu senden, ist es leer! Irgendeine Idee ?Kann nicht Liste zu Recycler View Adapter Android

Dies ist Aktivität

public class ToDoRecycler extends AppCompatActivity { 
    RecyclerView todoRecyclerView; 

    private RecyclerView.Adapter todoAdapter; 
    private RecyclerView.LayoutManager todoLayoutManager; 
    public List<ToDo>results; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_to_do_recycler); 


     todoRecyclerView = (RecyclerView)findViewById(R.id.todoRecyclerView); 
     todoRecyclerView.setHasFixedSize(true); 
     results= new ArrayList<ToDo>(); 
     todoLayoutManager = new LinearLayoutManager(this); 
     todoRecyclerView.setLayoutManager(todoLayoutManager); 
     todoRecyclerView.setAdapter(todoAdapter); 
     todoAdapter = new TodoRecyclerAdapter(this,results); 
     getRetrofitObject(); 
     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(ToDoRecycler.this,AddToDo.class); 
       startActivity(intent); 
      }});} 

    public void getRetrofitObject() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     APIService service = retrofit.create(APIService.class); 
     Call<Result> call = service.getresults(); 
     call.enqueue(new Callback<Result>() { 
      @Override 
      public void onResponse(Call<Result> call, Response<Result> response) { 
       results = response.body().getResults(); 
      } 
      @Override 
      public void onFailure(Call<Result> call, Throwable t) { 
       Log.d("onFailure", t.toString()); 
      }});} 
} 

Adapter

public class TodoRecyclerAdapter extends RecyclerView.Adapter<TodoRecyclerAdapter.ViewHolder> { 
static List<ToDo> todoResults; 
static Context context; 
List<ToDo>results; 
public TodoRecyclerAdapter(List<ToDo> results) { 
    this.todoResults = results; 
} 
@Override 
public TodoRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.todo_items, null); 
    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
    return viewHolder; 
} 
@Override 
public void onBindViewHolder(final TodoRecyclerAdapter.ViewHolder holder, final int position) { 


} 

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


public static class ViewHolder extends RecyclerView.ViewHolder { 
    public TextView todoTitle; 

    public ViewHolder(View itemLayoutView) { 
     super(itemLayoutView); 
     todoTitle = (TextView) itemLayoutView.findViewById(R.id.todo_title); 
    } 
} 
} 

Antwort

0

Das Problem ist, dass Sie die Adapter, bevor die Ergebnisse kommen von Retrofit schaffen/calling ...!

Sie sollten auf die Ergebnisse warten, und wenn Sie das Ergebnis erhalten, initialisieren und setzen Sie den Adapter auf die Recyclerview im Callback ...!

den Code unten verwenden etwas Hilfe zu bekommen,

call.enqueue(new Callback<Result>() { 
       @Override 
       public void onResponse(Call<Result> call, Response<Result> response) { 
        results = response.body().getResults(); 
todoRecyclerView.setAdapter(new TodoRecyclerAdapter(this,results));    
} 
       @Override 
       public void onFailure(Call<Result> call, Throwable t) { 
        Log.d("onFailure", t.toString()); 

       }});} 

und entfernen Sie den Adapter Initialisierung von onCreate() -Methode

Update: Ihre Aktivitätsklasse wie die folgenden aussehen sollte,

public class ToDoRecycler extends AppCompatActivity { 
    RecyclerView todoRecyclerView; 

    private RecyclerView.Adapter todoAdapter; 
    private RecyclerView.LayoutManager todoLayoutManager; 
    public List<ToDo>results; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_to_do_recycler); 


     todoRecyclerView = (RecyclerView)findViewById(R.id.todoRecyclerView); 
     todoRecyclerView.setHasFixedSize(true); 
     results= new ArrayList<ToDo>(); 
     todoLayoutManager = new LinearLayoutManager(this); 
     todoRecyclerView.setLayoutManager(todoLayoutManager); 
     getRetrofitObject(); 
     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(ToDoRecycler.this,AddToDo.class); 
       startActivity(intent); 
      }});} 
} 

    public void getRetrofitObject() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     APIService service = retrofit.create(APIService.class); 
     Call<Result> call = service.getresults(); 
     call.enqueue(new Callback<Result>() { 
      @Override 
      public void onResponse(Call<Result> call, Response<Result> response) { 
       results = response.body().getResults(); 
       todoRecyclerView.setAdapter(new TodoRecyclerAdapter(ActivityName.this,results));  
      } 
      @Override 
      public void onFailure(Call<Result> call, Throwable t) { 
       Log.d("onFailure", t.toString()); 
      }});} 

} 
+0

danke sehr sehr brei –

+0

jederzeit .......! :) –

0

Ersetzen Sie diese zwei Zeilen

todoRecyclerView.setAdapter(todoAdapter); 
todoAdapter = new TodoRecyclerAdapter(this,results); 

dazu:

todoAdapter = new TodoRecyclerAdapter(this,results); 
todoRecyclerView.setAdapter(todoAdapter); 
+0

das ist nicht mein Problem –

0

Konstruieren Sie den Adapter zuerst und fügen Sie dann den Adapter mit Ihrem RecyclerView

todoAdapter = new TodoRecyclerAdapter(this,results); 
todoRecyclerView.setAdapter(todoAdapter); 

Dann müssen Sie den Adapter über die Änderung in der Datenmenge dieses

public void getRetrofitObject() { 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    APIService service = retrofit.create(APIService.class); 
    Call<Result> call = service.getresults(); 
    call.enqueue(new Callback<Result>() { 
     @Override 
     public void onResponse(Call<Result> call, Response<Result> response) { 
      results = response.body().getResults(); 
      // Call notifyDataSetChanged here 
      todoAdapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onFailure(Call<Result> call, Throwable t) { 
      Log.d("onFailure", t.toString()); 
     }});} 

mögen Sie sich beziehen benachrichtigen Update

So während der results zum ersten Mal, offensichtlich seine null da keine Daten drin sind. Sie müssen dies in Ihrem TodoRecyclerAdapter behandeln. Einfach können Sie den null Wert in der getCount Funktion überprüfen und 0 zurückgeben, wie diese

public int getCount() { 
    if(results != null) return results.size(); 
    else return 0; 
} 
+0

danke, das ich diese verwenden, aber die todoAdapter = new TodoRecyclerAdapter (dies ergibt); Ergebnisse ist null! –

+0

Bitte beachten Sie die aktualisierte Antwort –

+0

nicht funktioniert die Liste ist null –

0

Offenbar fehlt Ihrer onBindViewHolder-Methode eine Implementierung an d Ihr ViewHolder Konstruktor keinen ViewHolder zurückkehren ..

Verwandte Themen