繁体   English   中英

使用Realm数据库中的项目的RecyclerView崩溃

[英]RecyclerView using item from a Realm database crashes

我有一个片段,它想显示游戏对象的列表。 当片段开始时,我从数据库中读取了所有Game对象,并将它们添加到List中。 在列表的大小达到12之前,一切正常。如果确实如此,则即使在显示片段之前,应用程序也会崩溃。 如果列表大于13,则只有当我一直向下滚动并尝试显示下面的游戏时,它才会崩溃。

关于什么原因的任何想法? 我真的不相信RecyclerView是问题所在。 这是我的课。 如果您需要更多信息,请告诉我。

任何帮助将非常欢迎。

我的游戏课

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;
}
}

我的片段

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;
    }
}
}

编辑:这是日志:

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行得到一些空值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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