1

Stackoverflowでも同様の質問がありましたが、動作する回答はありませんでした。この問題を解決する方法を見つけることはできません。FirebaseRecyclerAdapter error:java.lang.Throwable:addInArray

RecyclerViewはうまく動作しているようですが、それはゆっくりロードし、私はRecyclerView 4の項目について20回を繰り返し、このエラーを取得しています。

私のエラーログ(20回このエラー):

D/ViewGroup: addInArray been called, this = android.support.v7.widget.RecyclerView{...} ,child = android.widget.LinearLayout{...} ,call stack = java.lang.Throwable: addInArray 
                    at android.view.ViewGroup.addInArray(ViewGroup.java:3786) 
                    at android.view.ViewGroup.attachViewToParent(ViewGroup.java:4353) 
                    at android.support.v7.widget.RecyclerView.access$000(RecyclerView.java:155) 
                    at android.support.v7.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:727) 
                    at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:239) 
                    at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7385) 
                    at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7362) 
                    at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7350) 
                    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1459) 
                    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408) 
                    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) 
                    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3379) 
                    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3194) 
                    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3632) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1160) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1193) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1160) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
                    at android.view.View.layout(View.java:15146) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4866) 
                    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342) 
                    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2048) 
                    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211) 
                    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6282) 
                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
                    at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
                    at android.view.Choreographer.doFrame(Choreographer.java:560) 
                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
                    at android.os.Handler.handleCallback(Handler.java:808) 
                    at android.os.Handler.dispatchMessage(Handler.java:103) 
                    at android.os.Looper.loop 

これは私のコードです:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
LinearLayoutManager manager = new LinearLayoutManager(this); 
listRaces.setHasFixedSize(true); 
FirebaseRecyclerAdapter mAdapter = new FirebaseRecyclerAdapter<Race, ViewHolder>(Race.class, R.layout.races_row, ViewHolder.class, ref.child(Constant.FIREBASE_RACES).orderByChild("runners/" + User.getId()).equalTo(true).limitToFirst(4)) { 
    @Override 
    protected void populateViewHolder(ViewHolder viewHolder, Race race, int position) { 
     MyLog.log(String.valueOf(position)); 

     if(position<3) { 
      viewHolder.setDistance(String.valueOf(race.distance) + " Km"); 
      viewHolder.setLevels(String.valueOf(race.level_min) + " - " + String.valueOf(race.level_max)); 
      viewHolder.setRunners(String.valueOf(race.signed_runners) + "/" + String.valueOf(race.max_runners)); 
      viewHolder.setTime(TimeHandler.timestampToDate(String.valueOf(race.date))); 

     } else { 
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
      viewHolder.textListDistance.setLayoutParams(layoutParams); 
      viewHolder.setDistance("Ver todas..."); 
      viewHolder.textListDistance.setTextSize(14f); 
      viewHolder.textListDistance.setGravity(Gravity.CENTER); 
      viewHolder.textListDistance.setTypeface(null, Typeface.ITALIC); 
     } 
    } 
}; 

listRaces.setAdapter(mAdapter); 
listRaces.setLayoutManager(manager); 

そして、これが私のViewHolderクラスです:

public static class ViewHolder extends RecyclerView.ViewHolder { 
    private final TextView textListDistance; 
    private final TextView textListLevels; 
    private final TextView textListRunners; 
    private final TextView textListTime; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     textListDistance = (TextView) itemView.findViewById(R.id.textListDistance); 
     textListLevels = (TextView) itemView.findViewById(R.id.textListLevels); 
     textListRunners = (TextView) itemView.findViewById(R.id.textListRunners); 
     textListTime = (TextView) itemView.findViewById(R.id.textListTime); 
    } 

    public void setDistance(String distance) { 
     textListDistance.setText(distance); 
    } 
    public void setLevels(String levels) { 
     textListLevels.setText(levels); 
    } 
    public void setRunners(String runners) { 
     textListRunners.setText(runners); 
    } 
    public void setTime(String time) { 
     textListTime.setText(time); 
    } 
} 

私は本当に意志このための助けを感謝します。ありがとう。

EDIT:

であってもエラーが残るこの単純化されたコードで:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
     LinearLayoutManager manager = new LinearLayoutManager(this); 
     listRaces.setLayoutManager(manager); 
     listRaces.setHasFixedSize(true); 
     FirebaseRecyclerAdapter mAdapter = new FirebaseRecyclerAdapter<Race, ViewHolder>(Race.class, R.layout.races_row, ViewHolder.class, ref.child(Constant.FIREBASE_RACES).orderByChild("runners/" + User.getId()).equalTo(true).limitToFirst(4)) { 
      @Override 
      protected void populateViewHolder(ViewHolder viewHolder, Race race, int position) { 
        viewHolder.setDistance(String.valueOf(race.distance) + " Km"); 
        viewHolder.setLevels(String.valueOf(race.level_min) + " - " + String.valueOf(race.level_max)); 
        viewHolder.setRunners(String.valueOf(race.signed_runners) + "/" + String.valueOf(race.max_runners)); 
        viewHolder.setTime(TimeHandler.timestampToDate(String.valueOf(race.date))); 
      } 
     }; 
     listRaces.setAdapter(mAdapter); 

ここに私のraces_rowレイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:orientation="horizontal" 
    android:background="@drawable/list_races_public" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" 
    android:paddingTop="14dp"> 

    <TextView 
     android:id="@+id/show_all" 
     android:visibility="gone" 
     android:gravity="center" 
     android:text="Ver todas..." 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="14dp" 
     android:textStyle="italic" /> 

    <TextView android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:text="5 Km" 
     android:textStyle="bold" 
     android:textSize="18dp" 
     android:id="@+id/textListDistance" 
     android:layout_marginRight="10dp" 
     android:gravity="right" /> 

    <TextView 
     android:layout_width="50dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/textListLevels" 
     android:text="1 - 5" 
     android:textAlignment="center" /> 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="16dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="16dp" 
     android:src="@drawable/user" 
     android:layout_marginTop="2dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/textListRunners" 
     android:text="3/5" 
     android:layout_marginLeft="10dp" 
     android:textSize="16dp" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/textListTime" 
     android:text="-3:59" 
     android:textSize="16dp" 
     android:gravity="right" /> 


</LinearLayout> 

そしてここで、デバイス上でレンダリングRecyclerView

RecyclerView

ありがとうございます。

+0

誰も手助けできないことはありますか? –

答えて

0

まず、RecyclerViewのスクロールを遅くするpopulateViewHolder機能にLayoutParamsを設定しています。この目的のために異なるレイアウトを使用している場合や、可視性をGONEまたはに設定するだけで、同じレイアウトを使用できます。

基本的にレイアウトには4つのTextViewがあります。今度はこのようなレイアウトを設定してください。 ViewHolder

public static class ViewHolder extends RecyclerView.ViewHolder { 
    // ... Other textviews 
    private final TextView textListDistanceItalic; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     // ... Initialize others 
     textListDistanceItalic = (TextView) itemView.findViewById(R.id.distance_italic); 
    } 

    // ... Other Setters 
    public void setItalicInvisible() { 
     textListDistanceItalic.setVisibility(View.GONE); 
    } 
    public void setItalicVisible() { 
     textListDistanceItalic.setVisibility(View.VISIBLE); 
    } 
} 

に余分TextViewを入れ

<LinearLayout ..> 
    <TextView 
     android:id="@+id/distance" ../> 

    <!-- Add an extra TextView here and set visibility=gone by default --> 
    <TextView 
     android:id="@+id/distance_italic" 
     android:visibility="gone" 
     android:gravity="center" ../> 

    <TextView 
     android:id="@+id/level" ../> 
    <TextView 
     android:id="@+id/runner" ../> 
    <TextView 
     android:id="@+id/time" ../> 
</LinearLayout> 

今、あなたのpopulateViewHolder機能では、これを持っていることがあります。

if(position < 3) { 
    // Call the setters 
    // ... 

    // Set the italic distance invisible 
    viewHolder.setItalicInvisible(); 

} else { 
    // Call the setters 
    // ... 

    // Set the italic distance visible 
    viewHolder.setItalicVisible(); 
} 
+0

本当にありがとうございましたが、試してみるとエラーは同じです。コードを単純化しても、イタリック体のためのすべての 'else'部分を削除しても、まだ残っています。私は簡単なコード、行のための私のxmlレイアウトとレンダリングされた 'RecyclerView'をデバイスに表示するために私の答えを編集するつもりです。 –

関連する問題