Reputation: 219
I have a problem with my RecyclerView (Relating to my question here: Create a menu like on youtube in android studio). I've asked a question about making an options menu like on youtube. I've done all of the steps from this tutorial here: http://www.androidhive.info/2016/01/android-working-with-recycler-view/
When I start my app in debuggin mode I'm getting an error:
E/RecyclerView: No adapter attached; skipping layout
Here is my Fragment class:
package de.myfirstapp.app;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import static android.content.Context.MODE_PRIVATE;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link SettingsFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link SettingsFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class SettingsFragment extends Fragment {
// Variables
private OnFragmentInteractionListener mListener;
// Variables for Recycler View
private List<Settings> settingList = new ArrayList<>();
private RecyclerView recyclerView;
private SettingsAdapter sAdapter;
public SettingsFragment() {
// Required empty public constructor
}
//Change the title in action bar
public void onResume(){
super.onResume();
String titleString = getResources().getString(R.string.title_activity_navigation_drawer_settings);
// Set title bar
((NavigationDrawerActivity) getActivity())
.setActionBarTitle(titleString);
}
public static SettingsFragment newInstance() {
SettingsFragment fragment = new SettingsFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_settings, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.settings_recycler_view);
sAdapter = new SettingsAdapter(settingList);
RecyclerView.LayoutManager sLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(sLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(sAdapter);
prepareSettingsData();
return view;
}
private void prepareSettingsData() {
// Create new setting
Settings setting = new Settings("Abmelden");
settingList.add(setting);
// Notify data changes
sAdapter.notifyDataSetChanged();
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onStart() {
super.onStart();
try {
mListener = (OnFragmentInteractionListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(getActivity().toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
My SettingsAdapter.class:
package de.myfirstapp.app;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by Johannes on 19.01.2017.
*/
public class SettingsAdapter extends RecyclerView.Adapter<SettingsAdapter.MySettingHolder> {
private List<Settings> settingList;
public class MySettingHolder extends RecyclerView.ViewHolder {
public TextView settingTitle;
public MySettingHolder(View view) {
super(view);
settingTitle = (TextView) view.findViewById(R.id.settingTitle);
}
}
public SettingsAdapter (List<Settings> settingList) {
this.settingList = settingList;
}
@Override
public MySettingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_settings, parent, false);
return new MySettingHolder(itemView);
}
@Override
public void onBindViewHolder(MySettingHolder holder, int position) {
Settings setting = settingList.get(position);
holder.settingTitle.setText(setting.getSettingTitle());
}
@Override
public int getItemCount() {
return settingList.size();
}
}
When you need the other classes too like the the xml you can leave a comment but I don't want to overload the question with unnecessary informations.
Upvotes: 0
Views: 129
Reputation: 6025
Its because your settingList is empty use below code
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_settings, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.settings_recycler_view);
prepareSettingsData();
sAdapter = new SettingsAdapter(settingList);
RecyclerView.LayoutManager sLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(sLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(sAdapter);
return view;
}
Upvotes: 1
Reputation: 1809
That was my bad in previous answer,
Please try doing this,
Try to move this code into onStart()
method,
RecyclerView.LayoutManager sLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(sLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(sAdapter);
Upvotes: 1