RecyclerView является нулевым во фрагменте - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть MainActivity, которые содержат видоискатель, который содержит 2 фрагмента:

MainActivity

ViewPager viewPager =  findViewById(R.id.viewPager);
    MyPagerAdapter adapter = new MyPagerAdapter(this,
            getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    TabLayout tabLayout = findViewById(R.id.TabLayout);
    tabLayout.setupWithViewPager(viewPager);
    Fragment fragmentHour=adapter.getItem(1);
    onChangeDayListener2= (OnChangeDayListener) fragmentHour;

У меня также есть интерфейс для отправки данных из основной активности вфрагмент:

    public interface OnChangeDayListener{
    void OnChange(WeatherList list,int pos);
}

, но когда я пытаюсь работать с этим обратным вызовом в интерфейсе, мой адаптер утилизатора всегда имеет значение null:

HourWeatherFragment:

public class HourWeatherFragment extends Fragment implements MainScreen.OnChangeDayListener{
private RecyclerView recyclerView;
private AdapterHour adapter;
private ArrayList<Weather> days;
Context context;
static HttpClient httpClient;
public HourWeatherFragment() {
    // Required empty public constructor
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    days=new ArrayList<>();
    adapter = new AdapterHour(days,getActivity());
    LinearLayoutManager LayoutManager = new LinearLayoutManager(getActivity().getBaseContext(),
            LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(LayoutManager);
    recyclerView.setAdapter(adapter);
    days.add(new Weather());
    recyclerView.getAdapter().notifyDataSetChanged();
    Log.d("recycler","adapter seted!");
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_hour_weather, container, false);
    recyclerView = rootView.findViewById(R.id.hour_list);
    httpClient=new HttpClient();

    MyAsyncTask task=new MyAsyncTask();
     //   task.execute("lviv");
    return rootView;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context=context;
}

@Override
public void OnChange(WeatherList list,int pos) {
    String date=list.getAverageWeather().get(pos).getDate();
    ArrayList<Weather> weather=list.getByDate(date);
    Log.d("ldata","size of weather for adding="+weather.size());
   // days.add(new Weather());
    if(adapter!=null){
    adapter.notifyDataSetChanged();
        Log.d("tag","first null!");}
    else{
        try{
        recyclerView.getAdapter();}
        catch (NullPointerException ex){
            Log.d("tag","null!");//THERE ALWAYS NULL
        }}

Итак, сначала создавая действие, затем я запускаю загрузку данных, и когда данные загружаются, я отправляю данные из MainActivity в HourWeatherFragment посредством обратного вызова, но когда я получаю данные во фрагменте, мой адаптер имеет значение null, как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Вы должны привести RecyclerView.

в свой фрагмент и метод onCreateView:

recyclerView = (RecyclerView) rootView.findViewById(R.id.hour_list);
0 голосов
/ 01 августа 2019

Я знаю, что это старый вопрос, но вопреки принятому ответу, я думаю, проблема в том, что дескриптор виджета фрагмента, такой как recyclerView, недоступен в функции OnCreateView.

Дескрипторы (илиуказатели (если хотите) на виджеты гарантированно существуют только в функции OnViewCreated .

В этой документации есть хорошее описание жизненного цикла фрагментов: https://guides.codepath.com/android/Creating-and-Using-Fragments

выписка:

// This event is triggered soon after onCreateView().
// onViewCreated() is only called if the view returned from onCreateView() is non-null.
// Any view setup should occur here.  E.g., view lookups and attaching view listeners.
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   super.onViewCreated(view, savedInstanceState);
   ListView lv = (ListView) view.findViewById(R.id.lvSome);
   lv.setAdapter(adapter);
}

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2019

Вы можете создать статический одноэлементный класс для хранения данных и извлечения этих данных из фрагмента.

public class DataHolder {

   //create static variables here.

}

В вашем фрагменте просто получите данные и сделайте их нулевыми после этого.

Альтернативное решение

Другое решение заключается в использовании Связки . Здесь следуйте пакетному решению.

...