2016-05-24 14 views
0

Firebaseのデータに基づいてCardViewを作成するRecyclerViewを作成しようとしています。RecyclerView OutOfBoundsException配列内に項目がない場合

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Firebase.setAndroidContext(this); 
    setContentView(R.layout.activity_discussion); 
    toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    setSupportActionBar(toolbar); 
    setTitle(R.string.discussion_title_text); 

    mDateFormat = new SimpleDateFormat("MM-dd-yyyy"); 
    mDate = new Date(); 
    mCurrentDateString = mDateFormat.format(mDate); 

    mBaseRef = new Firebase(FIREBASE_URL); 
    mPollsRef = mBaseRef.child(POLLS_LABEL); 
    mUpdateRef = mPollsRef.child(mCurrentDateString).child(String.valueOf(mPollIndex + 1)); 
    mCommentsRef = mUpdateRef.child(COMMENTS_LABEL); 

    mPollImage = (ImageView) findViewById(R.id.comments_image); 
    mPollCommentQuestion = (TextView) findViewById(R.id.poll_comment_question); 
    mUserComment = (EditText) findViewById(R.id.user_comment); 
    mUserAvatar = (ImageView) findViewById(R.id.profile_image_avatar); 

    mCommentArrayList = new ArrayList<Comments>(); 
    mCommentIDArrayList = new ArrayList<String>(); 


    mPollCommentsList = (RecyclerView) findViewById(R.id.poll_comments_list); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    mPollCommentsList.setLayoutManager(llm); 
    mPollCommentsList.setHasFixedSize(true); 

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 

    mUpdateRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      setImage(dataSnapshot); 
      setQuestion(dataSnapshot); 
      createInitialCommentIDArray(dataSnapshot); 
      mNumberOfCommentsAtPoll = (int) dataSnapshot.child(COMMENTS_LABEL).getChildrenCount(); 
      for (int i = 0; i < mNumberOfCommentsAtPoll; i++) { 
       String commentID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("COMMENT").getValue(); 
       Log.v("COMMENT_ID", "The comment ID is " + commentID); 
       String userID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("USER_ID").getValue(); 
       Log.v("USER_ID", "The user ID is " + userID); 
       mCommentArrayList.add(0, new Comments(mUserAvatar, userID, commentID)); 
       mCommentAdapter.notifyDataSetChanged(); 
      } 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 

    mCommentAdapter = new MyAdapter(mCommentArrayList); 
    mPollCommentsList.setAdapter(mCommentAdapter); 


    Intent intent = getIntent(); 
    String pollID = intent.getStringExtra("POLL_ID"); 
    mPollIndex = intent.getIntExtra("POLL_INDEX", 0); 


    //TODO: Store unique comment ID's in an array 

    //TODO: Figure out how to programmatically add images to AWS and then store URL in Firebase 
    ImageView fab = (ImageView) findViewById(R.id.add_comment); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      HashMap<String, Object> commentMap = new HashMap<String, Object>(); 
      commentMap.put("USER_ID", mBaseRef.getAuth().getUid()); 
      commentMap.put("COMMENT", mUserComment.getText().toString()); 
      mUpdateRef.child(COMMENTS_LABEL).push().updateChildren(commentMap); 
      hideKeyboard(view); 
      mUserComment.setText(""); 
      Toast.makeText(getApplicationContext(), R.string.comment_added, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

マイArrayアダプタは、私が注意:Firebaseにデータがないとき、私はRecyclerViewは(任意のデータなし)を表示するためにFirebaseでデータがないときしかし、私は希望、はIndexOutOfBoundsExceptionを受け付けておりますエラーが発生している:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private ArrayList<Comments> mDataSet; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     protected ImageView userAvatar; 
     protected TextView userID; 
     protected TextView userComment; 

     public ViewHolder(View v) { 
      super(v); 
      userAvatar = (ImageView) findViewById(R.id.profile_image_avatar); 
      userID = (TextView) findViewById(R.id.user_ID); 
      userComment = (TextView) findViewById(R.id.user_comment); 
     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(ArrayList<Comments> myDataset) { 
     mDataSet = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.individual_comment, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ViewHolder x = new ViewHolder(v); 

     return x; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 

    //The OutOfBoundsException is pointing here 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
      holder.userComment.setText(mCommentArrayList.get(position).getUserComment()); 
      String x = mCommentArrayList.get(position).getUserComment(); 
      Log.v("ON_BIND_VIEW", "THE STRING IS " + x); 
     } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mNumberOfCommentsAtPoll; 
    } 
} 

結果:あなたが代わりにmNumberOfCommentsAtPollのgetItemCount()メソッドでは()mDataset.sizeを返すようにしてください enter image description here

+0

は、私はまた、この投稿に気づいた:http://stackoverflow.com/questions/30220771/recyclerview-inconsistency-detected-invalid-item-position。これは適用されますか? – tccpg288

答えて

2

を。

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

+0

私はそれを打ち、あなたに知らせるでしょう。あなたは他の問題は一切見かけますか? – tccpg288

+0

それは働いた!ありがとう、しかし、私のCardViewの動作は実際に適切なテキストを表示していません。また、CardViewsは予想以上に大きく表示されています(編集されたポストのスクリーンショットを参照)。 – tccpg288

+0

私はそのホワイトスペースのすべてを特に言及しています。 – tccpg288

関連する問題