Visualizzare un RecyclerView nel frammento

Sto provando il nuovo RecyclerView in Android Lollipop e sono bloccato.

Sto cercando di ricevere un elenco, con un'icona e un TextView a destra dell'icona, all'interno di un Fragment .

  • Eccezione irreversibile: java.lang.IllegalStateException GoogleApiClient non è ancora stato collegato
  • Android: riconnetta a Wi-Fi dopo aver inserito l'area di copertura mentre lo schermo è spento
  • Imposta l'image sul lato sinistro di EditText in Android
  • Devo utilizzare PendingIntent.getService () o getBroadcast con AlarmManager?
  • Retrofit 2 - corpo di risposta nullo
  • Errore Gradle: Imansible trovare com.android.tools.build:gradle:2.2.3
  • Ho trovato questo grande tutorial su come impostare un RecyclerView . Ho seguito each punto e ho cambiato solo la voce item_layout.xml per soddisfare le mie esigenze.

    Il progetto si costruisce senza alcun errore ma quando viene lanciato sul mio dispositivo, ottengo questo errore:

    java.lang.RuntimeException: Imansible avviare attività ComponentInfo {com.fredrikaldgard.materialcolors / com.fredrikaldgard.materialcolors.MainActivity}: java.lang.NullPointerException: Tentativo di ricall il metodo virtuale 'void android.support.v7.widget.RecyclerView. setLayoutManager (android.support.v7.widget.RecyclerView $ LayoutManager) 'su un riferimento di null object

    Ho provato a google il problema ma sono abbastanza amatoriale con lo sviluppo di Android.

    Ecco il mio MainActivity :

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

    E mio MyAdapter :

     public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private ItemData[] itemsData; public MyAdapter(ItemData[] itemsData) { this.itemsData = itemsData; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { // - get data from your itemsData at this position // - replace the contents of the view with that itemsData viewHolder.txtViewTitle.setText(itemsData[position].getTitle()); viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl()); } // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder { public TextView txtViewTitle; public ImageView imgViewIcon; public ViewHolder(View itemLayoutView) { super(itemLayoutView); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon); } } // Return the size of your itemsData (invoked by the layout manager) @Override public int getItemCount() { return itemsData.length; } } 

    Modifica: Ecco il Fragment

     public class ColorsFragment extends Fragment { public ColorsFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); return rootView; } } 

    Che cosa è andato male?

    3 Solutions collect form web for “Visualizzare un RecyclerView nel frammento”

    Questo è stato chiesto qualche ora fa, ma sulla base della risposta fornita da @ nacho_zona3 e dell'esperienza precedente con i frammenti, il problema è che i punti di vista non sono stati creati per il tempo che si sta cercando di trovare con il metodo findViewById() onCreate() per risolvere questo problema, spostare il seguente codice:

     // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

    alla chiamata onCreateView() tuo frammento. È necessaria una piccola quantità di refactoring perché tutte le variables ei methods chiamati da questo metodo devono essere statici. Il codice finale dovrebbe apparire come:

      public class ColorsFragment extends Fragment { public ColorsFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo", R.drawable.circle), new ItemData("Red", R.drawable.color_ic_launcher), new ItemData("Blue", R.drawable.indigo), new ItemData("Green", R.drawable.circle), new ItemData("Amber", R.drawable.color_ic_launcher), new ItemData("Deep Orange", R.drawable.indigo) }; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); return rootView; } } 

    Quindi la cosa principale è che dovunque chiamate findViewById() dovrai usare rootView.findViewById()

    È necessario recuperare RecyclerView in un Fragment dopo aver gonfiato la visualizzazione principale utilizzando quella visualizzazione. Forse non riesce a trovare il tuo riciclatore perché non fa parte dell'attività

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_artist_tracks, container, false); final FragmentActivity c = getActivity(); final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(c); recyclerView.setLayoutManager(layoutManager); new Thread(new Runnable() { @Override public void run() { final RecyclerAdapter adapter = new RecyclerAdapter(c); c.runOnUiThread(new Runnable() { @Override public void run() { recyclerView.setAdapter(adapter); } }); } }).start(); return view; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.