2016-04-27 22 views
1

Ich versuche Recyclerview und Setup-Adapter verwenden, aber ich bekomme Fehler: -Einstellung Adapter in Recyclerview

Kein Adapter angeschlossen; Überspringen Layout So helfen Sie mir bitte, wie dieses Problem

public class FragmentTwo extends Fragment { 
private AppAdapter mAppAdapter; 
private ArrayList<Model> mModel; 
@Bind(R.id.recycler_view) 
RecyclerView recyclerView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_two, container, false); 
    ButterKnife.bind(this, v); 
    recyclerView.setHasFixedSize(true); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setAdapter(mAppAdapter); 
    parseData(); 
    return v; 
} 

private void parseData() { 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("url") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    ReqInterface reqInterface = retrofit.create(ReqInterface.class); 
    Call<Model> call = reqInterface.getAdvanceData("france"); 
    call.enqueue(new Callback<Model>() { 
     @Override 
     public void onResponse(Call<Model> call, Response<Model> response) { 
      Model model = response.body(); 
      mModel = new ArrayList<Model>(Arrays.asList(model)); 
      mAppAdapter = new AppAdapter(mModel); 
      recyclerView.setAdapter(mAppAdapter); 
      mAppAdapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onFailure(Call<Model> call, Throwable t) { 
     } 
    }); 
    } 
    } 

Hier ist meine Recyclerview Adapter Klasse zu lösen: - im Voraus

public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> { 
private ArrayList<Model> mModel; 
TextView highTemp; 

public AppAdapter(ArrayList<Model> model) { 
    mModel = model; 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 
    TextView highTemp; 
    public ViewHolder(View view) { 
     super(view); 
     highTemp = (TextView) view.findViewById(R.id.card_view_tv_hightemp); 
    } 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View view = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.fragment_two, viewGroup, false); 
    return new ViewHolder(view); 

} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    viewHolder.highTemp.setText(String.valueOf(mModel.getName); 
} 

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

Dank

Antwort

2

Ihr Adapter initialisiert mAppAdapter wird nie dh es ist Null.

Daher recyclerView.setAdapter(mAppAdapter); ist das gleiche wie recyclerView.setAdapter(null);, so dass Sie eigentlich nie einen Adapter einstellen!

Denken Sie daran, Ihre Felder zu initialisieren:

mAppAdapter = new AppAdapter(mModel); // or whatever constructor you want 
recyclerView.setAdapter(mAppAdapter); 
+0

danke für die Antwort @blundell. Ich habe das zu meiner parseData-Methode hinzugefügt https://onedrive.live.com/redir?resid=CDB5011499C666C7!423&authkey=!ACcY4VdFdsyGh3k&ithint=file%2c –

3

Sie nie mAppAdapter den Adapter initialisieren, so ist es zur Laufzeit null. Sie vermissen etwas wie mAppAdapter = new AppAdapter(yourdata); vor dem Anruf zu setAdapter.

+0

Vielen Dank @Juan Cortes für die Antwort Ich habe dies zu meiner ParseData-Methode hinzugefügt https: //onedrive.live.com/redir?resid=CDB5011499C666C7!423&authkey=!ACcY4VdFdsyGh3k&ithint=file%2c –

+0

Poste deinen Code hier, ich lade deine Datei nicht von Onedrive herunter, sorry –

+0

siehe bitte die @Juan Cortes des Edits und thx für die Hilfe –

1

ändern

recyclerView.setAdapter(mAppAdapter); 

zu

recyclerView.setAdapter(new AppAdapter(model)); 
1

Sie nie Ihre mAppAdapter erstellen. Erstellen Sie eine neue Instanz Ihres Adapters und übergeben Sie diese in den Parametern .setAdapter.

Mit anderen Worten, Sie sollten .setAdapter(new AppAdapter(...)) verwenden, wobei ... durch die Parameter ersetzt wird, die Sie in AppAdapter erstellt haben.

1

Normalerweise mache ich den Retrofit-Aufruf in einer asynctask, dann, wenn Sie die Antwort vom Server erhalten, erstellen Sie einen neuen Adapter und legen Sie es auf die Recyclerview. Versuchen Sie auf jeden Fall, die .setAdapter-Zeile aus der onCreate() -Methode zu entfernen und lassen Sie sie einfach so, wie Sie sie haben. Es funktioniert und es stürzt nicht ab, der Grund, warum es abstürzt, ist, weil der Adapter null ist (es hat keine Elemente).

Ich hoffe, es hilft!

Verwandte Themen