简体   繁体   中英

RecyclerView using item from a Realm database crashes

I have a fragment that is suppose to show a list of Game objects. When the fragment starts, I read all the Game objects from the database and add them to a List. It all works fine until the size of the list reaches 12. If it does, the App crashes even before the fragment is shown. If the list is bigger than 13 then it only crashes if I scroll all the way down and try and show the Games that are below.

Any ideas on what could cause this? I don´t really believe the RecyclerView is the problem. Here are my classes. Please let me know if you need more information.

Any help would be very welcome.

My Game class

public class Game extends RealmObject{

@PrimaryKey
private long id;

private RealmList<Coordinates> mGameCoordinates;
private RealmList<Coordinates> mDrinkingStopsCoordinates;
private RealmList<Team> mTeams;
private String mDate;
private boolean mIsGameFinished;

private long mStartTime;
private long mFinishTime;
private long mTimeTaken;

public Game(RealmList<Team> teams, String date, long id) {
    mTeams = teams;
    mDate = date;
    this.id = id;
}

public int getGameSize(){
    int size = mTeams.size();
    return size;
}
public String getDate() {
    return mDate;
}

public void setDate(String date) {
    mDate = date;
}

public RealmList<Team> getTeams() {
    return mTeams;
}

public void setTeams(RealmList<Team> teams) {
    mTeams = teams;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

//Default empty constructor - must be present
public Game(){

}

public RealmList<Coordinates> getDrinkingStopsCoordinates() {
    return mDrinkingStopsCoordinates;
}

public void setDrinkingStopsCoordinates(RealmList<Coordinates> drinkingStopsCoordinates) {
    mDrinkingStopsCoordinates = drinkingStopsCoordinates;
}

public RealmList<Coordinates> getGameCoordinates() {
    return mGameCoordinates;
}

public void setGameCoordinates(RealmList<Coordinates> gameCoordinates) {
    mGameCoordinates = gameCoordinates;
}

public long getStartTime() {
    return mStartTime;
}

public void setStartTime(long startTime) {
    mStartTime = startTime;
}

public long getFinishTime() {
    return mFinishTime;
}

public void setFinishTime(long finishTime) {
    mFinishTime = finishTime;
}

public long getTimeTaken() {
    mTimeTaken = mFinishTime - mStartTime;
    return mTimeTaken;
}

public void setTimeTaken(long timeTaken) {
    mTimeTaken = timeTaken;
}

public boolean isGameFinished() {
    return mIsGameFinished;
}

public void setGameFinished(boolean gameFinished) {
    mIsGameFinished = gameFinished;
}
}

My Fragment

public class OldGameFragment extends Fragment {
private static final String TAG = "OldGameFragment";



private RecyclerView mRecyclerView;
private TextView mTextViewPlayers;
private TextView mTextViewDate;
private RecyclerAdapter mRecyclerAdapter;
private Toolbar myToolbar;
private String mStringReadyToShow;
private List<Game> mGames;
private RealmResults<Game> playerRealmResults;

private List<Game> mGameRealmList = new ArrayList<>();

private Realm mRealm;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

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

    //DB
    mRealm = Realm.getDefaultInstance();

    //Singleton
    ActivityStateSingleton activityStateSingleton = ActivityStateSingleton.getInstance();
    activityStateSingleton.setActivityFlag(1);

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

    //Toolbar
    myToolbar = (Toolbar)v.findViewById(R.id.my_toolbar_old_game);
    myToolbar.setTitle(R.string.drawer_old_game);
    myToolbar.setTitleTextColor(0xffffffff);
    ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    readFromDB();

    return v;
}

//Fragment
public static OldGameFragment newInstance(){
    return new OldGameFragment();
}

public void readFromDB(){
    RealmResults<Game> playerRealmResults = mRealm.where(Game.class).findAll();
    int count = 0;
    for(Game game : playerRealmResults){
        mGameRealmList.add(game);
        count++;
        Log.d(TAG, "Count " + count);
    }

    mRecyclerAdapter = new RecyclerAdapter(mGameRealmList);
    mRecyclerView.setAdapter(mRecyclerAdapter);
    mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getContext()));
    mRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(long id) {
            Intent intent = GameOverviewActivity.toGameOverview(getActivity(), id);
            startActivity(intent);
        }
    });
    mRecyclerAdapter.notifyDataSetChanged();
}

/*RecyclerView*/
public class RecyclerHolder extends RecyclerView.ViewHolder {
    private Game mGame;
    private SwipeRevealLayout mSwipeRevealLayout;
    private View mDeleteView;

    public RecyclerHolder(View itemView) {
        super(itemView);
        mTextViewPlayers = (TextView)itemView.findViewById(R.id.list_item_player_teams);
        mTextViewDate = (TextView)itemView.findViewById(R.id.list_item_date);
        mSwipeRevealLayout = (SwipeRevealLayout)itemView.findViewById(R.id.swipe_layout);
        mDeleteView = (View) itemView.findViewById(R.id.delete_layout);
    }

    public void bindPlayer(Game game){
        mGame = game;
        String name = game.getTeams().get(0).getTeamName();
        int num = game.getTeams().get(0).getPlayers().size();
        String text = name + "(" + num + ")";


        for(Team t : game.getTeams()){
            if(!text.contains(t.getTeamName())){
                name = t.getTeamName();
                num = t.getPlayers().size();
                text += " vs. " + name + "(" + num + ")";
            }

        mDeleteView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getContext(),
                        R.style.AlertDialogCustom));
                builder.setTitle(R.string.dialog_alert_title).setMessage(R.string.delete_game)
                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        mRecyclerAdapter.dismissGame(getAdapterPosition(), mGames.get(getAdapterPosition()).getId());
                    }
                }).setNegativeButton("Nein", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(getContext(), "No", Toast.LENGTH_SHORT).show();
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                //So it won´t show the white borders around the round egdges
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

            }
        });
        }
        mTextViewPlayers.setText(text);
        String date = getResources().getString(R.string.date) + game.getDate();
        String space = " ";
        mTextViewDate.setText(space + date);
    }


}

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerHolder>{

    /* This object helps you save/restore the open/close state of each view*/
    private final ViewBinderHelper mViewBinderHelper = new ViewBinderHelper();
    private OnItemClickListener mOnItemClickListener;


    public RecyclerAdapter(List<Game> realmResults){
        mGames = realmResults;
        /*To only open one row at the time*/
        mViewBinderHelper.setOpenOnlyOne(true);
    }

    @Override
    public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View v = layoutInflater.inflate(
                R.layout.list_item_game_rows, parent, false);

        return new RecyclerHolder(v);
    }

    @Override
    public void onBindViewHolder(RecyclerHolder holder, final int position) {
        final Game game = mGames.get(position);
        final String data = mGames.get(position).toString();
        // You need to provide a String id which uniquely defines the data object.
        mViewBinderHelper.bind(holder.mSwipeRevealLayout, data);
        holder.bindPlayer(game);

        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnItemClickListener.onItemClick(game.getId());
            }
        };

        mTextViewDate.setOnClickListener(listener);
        mTextViewPlayers.setOnClickListener(listener);

    }

    @Override
    public int getItemCount() {
        return mGames.size();
    }

    /*Dismiss Game*/
    public void dismissGame(int position, final long id){
        mGames.remove(position);
        this.notifyItemRemoved(position);
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<Game> gameRealmResults = mRealm.where(Game.class).equalTo("id", id).findAll();
                gameRealmResults.deleteAllFromRealm();
            }
        });
    }

    public OnItemClickListener getOnItemClickListener(){
        return mOnItemClickListener;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.mOnItemClickListener = onItemClickListener;
    }
}
}

EDIT: Here is the Log:

FATAL EXCEPTION: main                                                                                 Process: bosseln.swenden.de.bosseln, PID: 23424
Theme: themes:{default=overlay:com.init.designloper.init_v001, iconPack:com.init.designloper.init_v001, fontPkg:com.init.designloper.init_v001, com.android.systemui=overlay:com.init.designloper.init_v001, com.android.systemui.navbar=overlay:com.init.designloper.init_v001}
                                                                    java.lang.ArrayIndexOutOfBoundsException: rowIndex > available rows: 0 > 0
                                                                        at io.realm.internal.LinkView.nativeGetTargetRowIndex(Native Method)
                                                                        at io.realm.internal.LinkView.getTargetRowIndex(LinkView.java:81)
                                                                        at io.realm.RealmList.get(RealmList.java:448)
                                                                        at bosseln.swenden.de.bosseln.fragments.OldGameFragment$RecyclerHolder.bindPlayer(OldGameFragment.java:149)
                                                                        at bosseln.swenden.de.bosseln.fragments.OldGameFragment$RecyclerAdapter.onBindViewHolder(OldGameFragment.java:223)
                                                                        at bosseln.swenden.de.bosseln.fragments.OldGameFragment$RecyclerAdapter.onBindViewHolder(OldGameFragment.java:195)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6279)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6312)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5258)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5521)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5363)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5359)
                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2141)
                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1525)
                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1488)
                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:585)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3506)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3254)
                                                                        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3767)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1735)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1579)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1488)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1735)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1579)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1488)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2934)
                                                                        at android.view.View.layout(View.java:16639)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                        at android.

请检查数据库中的行,我认为您可能在第13行得到一些空值。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM