0

У меня есть ViewPager и в каждом ViewPager у меня есть ListView. \ValueEventListener не будет выполнен после установки адаптера

Когда я запускаю мое приложение, IndexOutOfBoundsException брошен в CourseListAdapter, потому что ValueEventListener не выполняются ...

но когда я удалить listView.setAdapter(mAdapter); мой ListView не будет заполняться, но я вижу D/CourseListAdapter: Getting information в моем регистраторе ..

My Фрагмент, который устанавливает ListView:

public class DayFragment 
     extends Fragment { 

    private static final String TAG = "DayFragment"; 

    private CourseListAdapter mAdapter; 

    private int day = 0; 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.course_list, container, false); 

     Bundle bundle = getArguments(); 

     // Yay a day is given 
     if (bundle != null) { 
      day = bundle.getInt("day"); 
     } 

     ListView listView = (ListView) rootView.findViewById(R.id.list_view); 

     mAdapter = new CourseListAdapter(getActivity(), day); 
     listView.setAdapter(mAdapter); 

     return rootView; 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 

     Log.i(TAG, "Removing the listener"); 

     // Clean up 
     mAdapter.removeListener(); 
    } 
} 

Мой ListView адаптер:

public class CourseListAdapter 
     extends BaseAdapter { 

    private static final String TAG = "CourseListAdapter"; 
    private Context mContext; 
    private List<Day> mDays = new ArrayList<>(); 
    private int mDay = 0; 
    private ValueEventListener mListener; 
    private FirebaseDatabase mDatabase; 
    private DatabaseReference mReference; 

    public CourseListAdapter(final Activity context, int day) { 
     mContext = context; 
     mDay = day; 

     // Setup Firebase 
     mDatabase = FirebaseDatabase.getInstance(); 
     mReference = mDatabase.getReference(); 

     mListener = mReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.d(TAG, "Getting information"); 

       for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
        Day day = postSnapshot.getValue(Day.class); 

        for (DataSnapshot course : postSnapshot.child("courses").getChildren()) { 
         day.addCourse(course.getValue(Course.class)); 
        } 

        mDays.add(day); 
       } 

       // Tell some data changed 
       notifyDataSetChanged(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.e(TAG, "Listen was cancelled, no more updates will occur"); 
      } 
     }); 
    } 

    public void removeListener() { 
     mReference.removeEventListener(mListener); 
    } 

    @Override 
    public int getCount() { 
     Day day = mDays.get(mDay); 

     return day.getCourses().size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Day day = mDays.get(mDay); 
     ViewHolder viewHolder; 

     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.course_items, parent, false); 

      viewHolder.course = (TextView) convertView.findViewById(R.id.course); 
      viewHolder.classRoom = (TextView) convertView.findViewById(R.id.class_room); 
      viewHolder.begin = (TextView) convertView.findViewById(R.id.begin); 
      viewHolder.end = (TextView) convertView.findViewById(R.id.end); 
      viewHolder.teacher = (TextView) convertView.findViewById(R.id.teacher); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.course.setText(day.getCourses().get(position).name); 
     viewHolder.classRoom.setText(day.getCourses().get(position).classRoom); 
     viewHolder.begin.setText(day.getCourses().get(position).from); 
     viewHolder.end.setText(day.getCourses().get(position).to); 
     viewHolder.teacher.setText(day.getCourses().get(position).teacher); 

     return convertView; 
    } 

    private class ViewHolder { 
     TextView course; 
     TextView classRoom; 
     TextView begin; 
     TextView end; 
     TextView teacher; 
    } 
} 

ответ

0

Синхронизация данных из Firebase является асинхронной операцией, которая означает, что не происходит сразу, так что вы в первую очередь необходимо, чтобы получить все необходимые данные из firebase, и только тогда, когда вам завершите сбор всех данных, установите адаптер списка. Я имею в виду, что вам нужно установить адаптер только тогда, когда onDataChange закончен, вы можете сделать общедоступный статический метод для установки адаптера и вызвать его из onDataChange после циклов for.

+0

Моя база данных общедоступна. Если я удалю '' 'listView.setAdapter (mAdapter),' '' part it works ... – yooouuri

+0

Можете ли вы опубликовать журнал ошибок? Я имею в виду, где произошло событие IndexOutOfBoundsException? –

+0

http://pastebin.com/raw/VjpZgCdh Исключение вызывается '' '' Day day = mDays.get (mDay); '' '' '' 'getCount'''. Поскольку «ValueEventListener» не будет вызван, массив пуст! – yooouuri

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