Android FirebaseRecyclerAdapter错误:java.lang.Throwable:addInArray

Android FirebaseRecyclerAdapter错误:java.lang.Throwable:addInArray,android,firebase-realtime-database,android-recyclerview,firebaseui,Android,Firebase Realtime Database,Android Recyclerview,Firebaseui,我在Stackoverflow上发现了类似的问题,但没有人能给出有效的答案,我不知道如何解决这个问题 我的RecyclerView似乎工作正常,但加载速度较慢,我发现此错误仅在RecyclerView中重复了20次 我的错误日志(此错误的20倍): 这是我的代码: DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); LinearLayoutManager manager = new LinearLayout

我在Stackoverflow上发现了类似的问题,但没有人能给出有效的答案,我不知道如何解决这个问题

我的
RecyclerView
似乎工作正常,但加载速度较慢,我发现此错误仅在
RecyclerView
中重复了20次

我的错误日志(此错误的20倍):

这是我的代码:

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);
我真的非常感谢你的帮助。谢谢

编辑:

即使使用此简化代码,错误仍然存在:

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);
这里是设备上呈现的
RecyclerView


非常感谢。

首先,您正在
populateViewHolder
功能中设置
layoututparams
,这可能会减慢
回收视图的滚动速度。为此,您可以使用不同的布局,也可以使用相同的布局,只需将可见性设置为
GONE
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();
}
if(位置<3){
//打电话给二传手
// ...
//将斜体距离设置为不可见
setItalicInvisible();
}否则{
//打电话给二传手
// ...
//设置可见的斜体距离
viewHolder.setItalicVisible();
}

首先,您正在
populateViewHolder
功能中设置
布局参数
,这可能会减慢
回收视图的滚动速度。为此,您可以使用不同的布局,也可以使用相同的布局,只需将可见性设置为
GONE
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();
}
if(位置<3){
//打电话给二传手
// ...
//将斜体距离设置为不可见
setItalicInvisible();
}否则{
//打电话给二传手
// ...
//设置可见的斜体距离
viewHolder.setItalicVisible();
}

非常感谢您的回答,但我只是尝试了一下,错误依然存在。即使简化代码,删除斜体文本的所有
else
部分,仍然保留。我将编辑我的答案,以便在设备中显示简化代码、行的xml布局和呈现的
RecyclerView
,这可能会有所帮助。非常感谢您的回答,但我只是尝试了一下,错误仍然是一样的。即使简化代码,删除斜体文本的所有
else
部分,仍然保留。我将编辑我的答案,以便在设备中显示简化代码、行的xml布局和呈现的
RecyclerView
,可能会有所帮助。
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);
    }
}
if(position < 3) {
    // Call the setters
    // ...

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

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

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