2017-01-19 4 views
0

У меня проблема с моим RecyclerView (относительно моего вопроса здесь: Create a menu like on youtube in android studio). Я задал вопрос о создании меню параметров, например, на youtube. Я сделал все шаги из этого учебника здесь: http://www.androidhive.info/2016/01/android-working-with-recycler-view/Получил ошибку в моем RecyclerView

Когда я начинаю мое приложение в режиме debuggin я получаю сообщение об ошибке:

E/RecyclerView: No adapter attached; skipping layout 

Вот мой Fragment класс:

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

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

 
}

Когда вам нужны другие классы тоже как XML, вы можете оставить свой комментарий, но я не хочу перегружать вопрос ненужной информации.

+0

Это предупреждение вы получите, только если адаптер не установлен на recyclerView. –

+0

Хорошо, но я приложил его. Я думаю, что – ItsOdi1

+0

использовать 'prepareSettingsData();' before'sAdapter = new SettingsAdapter (settingList); ' –

ответ

1

Это было моим плохим в предыдущем ответе,

Пожалуйста, попробуйте сделать это,

Попытки переместить этот код в onStart() метод,

RecyclerView.LayoutManager sLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
    recyclerView.setLayoutManager(sLayoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(sAdapter); 
+0

Я попробую :) что есть с 'sAdapter = new SettingsAdapter (settingList);' – ItsOdi1

+0

Там ошибка все еще существует – ItsOdi1

+0

Как @Pravin упоминается это потому, что ваш список пуст, когда вы пытаетесь установить адаптер, поэтому сначала попробуйте извлечь данные (вызовите 'prepareSettingsData();'), а затем попробуйте подключить адаптер. –

1

Его, потому что ваш settingList пусто использование ниже коды

@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; 
    } 
+0

Попытка вызвать виртуальный метод 'void de.myfirstapp.app.SettingsAdapter.notifyDataSetChanged() 'на ссылке нулевого объекта – ItsOdi1

+0

Я отделил компоновку recylcer от основного макета в свой собственный макет xml. Это не работает. Не знаю, почему: D – ItsOdi1

Смежные вопросы