0

を設定した後、私はviewPagerがあり、各viewPagerに私はListViewコントロールを持って実行されません。\私は私のアプリを実行するとValueEventListenerが実行されていないためValueEventListenerは、アダプタ

IndexOutOfBoundsExceptionがCourseListAdapterにスローされます...

しかし、私はlistView.setAdapter(mAdapter);私のリストビューが読み込まれることはありませんが、私は私のロガーでD/CourseListAdapter: Getting informationを参照してください削除。.. ListViewの設定

マイ・フラグメント:

10マイリストビューアダプタ:Firebaseからのデータを同期

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から必要なすべてのデータを取得する必要がありますので、それはすぐに起こらないことを意味し、非同期操作で、あなただけをすべてのデータの収集を完了し、リストビューアダプタを設定します。 onDataChangeが終了したときにのみアダプタを設定する必要があることを意味します。アダプタを設定するpublic staticメソッドをforループの後にonDataChangeから呼び出すことができます。

+0

私のデータベースは公開されています。 '' '' listView.setAdapter(mAdapter); ''部分が削除された場合... – yooouuri

+0

エラーログを公開できますか?つまり、IndexOutOfBoundsExceptionが発生した場所ですか? –

+0

http://pastebin.com/raw/VjpZgCdh例外は '' Day Day = mDays.get(mDay); '' '' 'getCount'''メソッドで呼び出されます。 "ValueEventListener"は配列と呼ばれることはないので、空です! – yooouuri

関連する問題