2017-03-06 11 views
0

私は、ゲームオブジェクトのリストを表示すると思われるフラグメントを持っています。フラグメントが始まると、データベースからすべてのゲームオブジェクトを読み込んでリストに追加します。それはリストのサイズが12に達するまでうまく動作します。そうであれば、フラグメントが表示される前でもアプリケーションがクラッシュします。リストが13より大きい場合は、すべてスクロールして下にあるゲームを試してみるとクラッシュするだけです。Realmデータベースのアイテムを使用してRecyclerViewがクラッシュする

これを引き起こす可能性のあるアイデアはありますか?私は本当に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; 
    } 
} 
} 

EDIT:ここ はログです:データベース内の行をチェック

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. 
+0

'がゲームオブジェクトであるように感じている{mGameRealmList.add(ゲームは);'なぜあなたはこれをやっていますか? RealmChangeListenerを使って同期をとるか、RealmRecyclerViewAdapter(realm-android-adaptorsから)(https://github.com/realm/realm-android-adapters) – EpicPandaForce

+0

私はそれを使うことはできませんでした。これは私の最初の大きなAndroidプロジェクトと、Realmを使用した最初の大きなプロジェクトです。私はそれを見て、頭の上にありがとう。 – AbelSantos

答えて

0

してください、私はそこかもしれないと思います行番号13で取得しているヌル値でなければなりません。

+0

Gameオブジェクトの問題だったように見えますが、それは空でした。ありがとうございました – AbelSantos

+0

@AbelSantos私の喜び.. –

+0

@AbelSantosあなたがそれを好きなら答えを受け入れてください。 –

0

投稿してくださいエラーログ はあなたに何か問題が(ゲームのゲーム:playerRealmResults)について

関連する問題