2016-03-30 28 views
0

我想填充數據到房車。如果我使用自定義適配器(RV的傳統適配器)來做到這一點。 數據正在填充。但我想用FirebaseRecyclerAdapter。這樣我可以減少一些鍋爐板代碼。而實施我得到Failed to bounce to type錯誤。數據未使用FirebaseRecyclerAdapter填充?

JSON從火力地堡

{ 
    "subscriptions" : { 
    "[email protected],com" : { 
     "-KDnfjROKeFAL9wccsxY" : { 
     "category" : "Mobility", 
     "goal" : "afternoon body weight workout", 
     "length" : 1, 
     "title" : "Afternoon HiiT", 
     "weeks" : { 
      "week1" : [ "High Knees", "Squats", "Lunges", "Diamond Push-ups", "Lying Triceps Lifts" ] 
     } 
     } 
    } 
    } 
} 

Program.java

public class Program { 
    private String title; 

    private String goal; 

    private String category; 

    private int length; 

    HashMap<String, ArrayList<String>> weeks; 

    public Program() { 
    } 

    public Program(String title, String goal, String category, int length, HashMap<String, ArrayList<String>> weeks) { 
     this.title = title; 
     this.goal = goal; 
     this.category = category; 
     this.length = length; 
     this.weeks = weeks; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getGoal() { 
     return goal; 
    } 

    public String getCategory() { 
     return category; 
    } 
    public int getLength() { 
     return length; 
    } 
    public HashMap<String, ArrayList<String>> getweeks() { 
     return weeks; 
    }  
} 

片段代碼

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.fragment_latest, container, false); 

     mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     mAdapter = new FirebaseRecyclerAdapter<Program, ProgramVH>(Program.class, R.layout.program_item, ProgramVH.class, mRef) { 
      @Override 
      public void populateViewHolder(final ProgramVH programViewHolder, Program mProgram, int position) { 
       programViewHolder.setName(program.getTitle()); 
       programViewHolder.level.setText(program.getLength()); 

      } 
     }; 
     mRecyclerView.setAdapter(mAdapter); 
     FetchData(); 
     return v; 
    } 

public void FetchData(){ 

     mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()) { 
        for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { 
         for (DataSnapshot programSnapshot : userSnapshot.getChildren()) { 
          program = programSnapshot.getValue(Program.class); 
          Log.e("VH", program.getTitle()); // Title is getting printed 
         } 
        } 
       } 
       mAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
      } 
     }); 

    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     mAdapter.cleanup(); 
    }  

ViewHolder

public static class ProgramVH extends RecyclerView.ViewHolder { 
     protected ImageView header; 
     protected TextView title; 
     protected TextView level; 

     public ProgramVH(View view) { 
      super(view); 
      this.header = (ImageView) view.findViewById(R.id.coverImage); 
      this.title = (TextView) view.findViewById(R.id.title); 
      this.level = (TextView) view.findViewById(R.id.level); 
     } 

     public void setName(String name) { 
      title.setText(name); 
     } 
    } 

棧跟蹤

08:55:19.045 5717-5717/com.android.sam E/VH:下午HIIT 8月3日至30日:55:19.045 5717 -5717/com.android.sam d/AndroidRuntime:關閉VM03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:致命異常:主 八月3日至30日:55:19.045 5717- 5717/com.android.sam E/AndroidRuntime:致命例外:main 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime :進程:com.android.sam,PID:5717 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:com.firebase.client.FirebaseException:無法反彈以輸入 03- 30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185) 8月3日至30日:55:19.045 5717-5717/COM .android.sam E/AndroidRuntime:在com.firebase.ui.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:161) 8月3日至30日:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在COM。 firebase.ui.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:150) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在com.firebase.ui.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java :190) 03-30 08:55:19.045 5717-5717/com.android.sam E/An droidRuntime:在android.support.v7.widget.RecyclerView $ Adapter.onBindViewHolder(RecyclerView.java:5465) 8月3日至30日:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support。 v7.widget.RecyclerView $ Adapter.bindViewHolder(RecyclerView.java:5498) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.v7.widget.RecyclerView $ Recycler .getViewForPosition(RecyclerView.java:4735) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java: 4611) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:1988) 03-30 08 :55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.v7.widget.LinearLayou tManager.layoutChunk(LinearLayoutManager.java:1384) 8月3日至30日:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1347 ) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 03-30 08:55: 19.045 5717-5717/com.android。sam E/AndroidRuntime:at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3026) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support .v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2903) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v7.widget.RecyclerView.onLayout( RecyclerView.java:3277) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.view.View.layout(View.java:15686) 03-30 08:55 :19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.view.ViewGroup.layout(ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1087) 03-30 08:55:19.045 5717-5717/com .android.sam E/AndroidRuntime:at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:797) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.design.widget.ViewOffsetBehavior.layoutChild(ViewOffsetBehavior.java:63) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.design.widget.HeaderScrollingViewBehavior .layoutChild(HeaderScrollingViewBehavior.java:126) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.design.widget.AppBarLayout $ ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1139) 03-30 08:55 :19.045 5717-5717/com.android.sam E/AndroidRu ntime:在android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:810) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.View。 layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.view.ViewGroup.layout(ViewGroup.java:5039) 03-30 08 :55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1684) 03-30 08:55:19.045 5717-5717/com .android.sam E/AndroidRuntime:在android.view.View.layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view。 ViewGroup.layout(ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.design.widget.HeaderScrollingViewBehavior.la在Android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) E/AndroidRuntime: 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.design.widget.AppBarLayout $ ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1139) 03-30 08:55: 19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:810) 03-30 08:55:19.045 5717-5717/com.android。 sam E/AndroidRuntime:在android.view.View.layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.ViewGroup.layout (ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/Androi dRuntime:在android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.widget.FrameLayout.onLayout(FrameLayout。 java:514) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.view.View.layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.ViewGroup.layout(ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.View.layout(View.java: 15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.ViewGroup.layout(ViewGroup。java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1183) 03-30 08 :55:19.045 5717-5717/com.android.sam E/AndroidRuntime:at android.view.View.layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.ViewGroup.layout(ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.widget.FrameLayout.layoutChildren E/AndroidRuntime:在android.widget.FrameLayout.onLayout(FrameLayout.java:514) 03-30 08:55發表評論較新的帖子較舊的帖子主頁訂閱:帖子(Atom) :19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.view.View.layout(View.java:15686) 03-30 08:55:19.045 5717-5717/com.a ndroid.sam E/AndroidRuntime:在android.view.ViewGroup.layout(ViewGroup.java:5039) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.widget.LinearLayout .setChildFrame(LinearLayout.java:1703) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 03-30 08:55:19.045 5717-5717/com.android.sam E/AndroidRuntime:在android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 03-30 08:55:19.045 5717-5717/com.android。 SAM E/AndroidRuntime:在android.view.View

UPDATE

中的數據被填充,如果我用下面ref

Firebase mRef = new Firebase("https://arulnadhan.firebaseio.com/").child("subscriptions/[email protected],com"); 

但是當我使用下面ref &的FetchData()方法這是行不通的!

Firebase mRef = new Firebase("https://arulnadhan.firebaseio.com/subscriptions"); 

public void FetchData(){ 

     mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()) { 
        for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { 
         for (DataSnapshot programSnapshot : userSnapshot.getChildren()) { 
          program = programSnapshot.getValue(Program.class); 
          Log.e("VH", program.getTitle()); // Title is getting printed 
         } 
        } 
       } 
       mAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
      } 
     }); 
    } 

** JSON下訂閱節點**

{ 
    "[email protected],com" : { 
    "-KDnhRwHjssOejrqyenP" : { 
     "category" : "Strength", 
     "goal" : "This workout can be done while on the phone!", 
     "length" : 1, 
     "title" : "Hello Workouts", 
     "weeks" : { 
     "week1" : [ "High Knees", "Jumping Jacks", "Wall sit", "Pushups", "Sit-ups", "Step ups", "Squats", "Tricep dips on chair", "Plank", "High Knees running in place", "Lunges", "Pushup and rotation", "Side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "Butt Kickers", "Lying Triceps Lifts", "One Arm Side Push-up", "Overhead Arm Clap", "Overhead Press", "Power Circles", "Push-up and Rotation", "T Push-ups", "Reverse Plank", "Spiderman Push-up", "T Raise", "Tricep Dips", "Wall Push-ups", "Wide Arm Push-ups", "Burpees" ] 
     } 
    }, 
    "-KDni3TN4NMyGXePyp92" : { 
     "category" : "Strength", 
     "goal" : "This workout can be done by a BABUJI", 
     "length" : 1, 
     "title" : "Indian Workouts", 
     "weeks" : { 
     "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ] 
     } 
    } 
    }, 
    "[email protected],com" : { 
    "-KDnfjROKeFAL9wccsxY" : { 
     "category" : "Mobility", 
     "goal" : "afternoon body weight workout", 
     "length" : 1, 
     "title" : "Afternoon HiiT", 
     "weeks" : { 
     "week1" : [ "High Knees", "Squats", "Lunges", "Diamond Push-ups", "Lying Triceps Lifts" ] 
     } 
    }, 
    "-KDps90Dn6XtJc6Co00b" : { 
     "category" : "Strength", 
     "goal" : "goal", 
     "length" : 1, 
     "title" : "title", 
     "weeks" : { 
     "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ] 
     } 
    } 
    } 
} 
+0

你爲什麼要叫'mRef.addListenerForSingleValueEvent()'*中*'populateViewHolder()'?這對我來說沒有任何意義。我強烈建議您採取一些措施,首先*遵循[FirebaseUI codelab](https://github.com/firebase/FirebaseUI-Android/tree/master/codelabs/chat)。 –

+0

我已經遵循chatMessage示例。但在看到這個答案後,我已經在'populateViewHolder()'裏面改變了它'http://stackoverflow.com/a/34561726/2781359 – user3467240

+0

'https:// arulnadhan.firebaseio.com /'下的每個用戶都有訂閱。根節點本身沒有訂閱。您不能跳過查詢中的級別。如果要顯示所有用戶的所有訂閱列表,則需要擁有數據庫中所有訂閱的列表。 –

回答

0

我不知道你mRef變量指的是什麼,但是這是所有我需要的:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    RecyclerView view = new RecyclerView(this); 
    setContentView(view); 

    view.setLayoutManager(new LinearLayoutManager(this)); 

    Firebase.setAndroidContext(this); 
    Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/36299197").child("subscriptions/[email protected],com"); 

    FirebaseRecyclerAdapter<Program, ProgramVH> adapter = new FirebaseRecyclerAdapter<Program, ProgramVH>(Program.class, android.R.layout.two_line_list_item, ProgramVH.class, ref) { 
     @Override 
     public void populateViewHolder(final ProgramVH programViewHolder, Program program, int position) { 
      System.out.println("populateViewHolder for position "+position+" with program "+program); 
      programViewHolder.title.setText(program.getTitle()); 
      programViewHolder.level.setText(""+program.getLength()); // coerce to string to prevent android.content.res.Resources$NotFoundException 
     } 
    }; 
    view.setAdapter(adapter); 
} 

由於我使用股票佈局,我修改了視圖持有人一點:

public static class ProgramVH extends RecyclerView.ViewHolder { 
    protected TextView title; 
    protected TextView level; 

    public ProgramVH(View view) { 
     super(view); 
     this.title = (TextView) view.findViewById(android.R.id.text1); 
     this.level = (TextView) view.findViewById(android.R.id.text2); 
    } 
} 

我爲它添加了一個Activity36299197到我的sample repo。如果您啓動該應用並從初始列表中選擇Activity36299197,您將看到您發佈的JSON中的數據。

screenshot of RecyclerView on Android device

+0

我用'mRef'變量做了一些調試&更新了問題! – user3467240

+0

如果您立即將完整的信息添加到問題中,這將非常有幫助。我無法繼續回到它並掃描更新。 –