2016-05-24 28 views
0

我想创建一个RecyclerView,它基于Firebase中的数据填充CardViews。我收到IndexOutOfBoundsException异常时,有在火力地堡没有数据,但是我想对于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(); 
     } 
    }); 
} 

我的数组适配器,我记下了错误发生:

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

结果: enter image description here

+0

这里我也注意到了这个帖子:http://stackoverflow.com/questions/30220771/recyclerview-inconsistency-detected-invalid-item-position。这是否适用? – tccpg288

回答

2

你应该尝试在getItemCount()方法,而不是mNumberOfCommentsAtPoll返回mDataset.size()。

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

+0

我会给它一个镜头,让你知道。你是否看到其他问题? – tccpg288

+0

它的工作!谢谢,但是我的CardView行为实际上并没有显示适当的文本。此外,CardViews出现比预期大得多(请参阅编辑后的截图)。 – tccpg288

+0

我特指所有的空白。 – tccpg288