2016-04-25 86 views
1

我試圖理解我怎麼能輕易分辨兩種不同的看法取決於物體上的一些信息進行充氣...如何在回收視圖中顯示多個視圖?

我的設置是像這樣,但我一直有這個錯誤而崩潰:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference 

指向這一行:

myViewHolder.commentUsername.setTypeface(boldTypeface); 

這是我的適配器:

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

    private List<DatabaseComment> dbCommentsList; 
    private DatabaseHelper db; 
    private Context context; 
    private Typeface typeFace, italicTypeface, boldTypeface; 


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     public TextView commentUsername, commentUserMsg, commentUserDate, commentUserRemove; 
     public ImageView emojiIcon; 


     public MyViewHolder(View view) { 
      super(view); 
      commentUsername = (TextView) view.findViewById(R.id.userAdapterUsername); 
      commentUserMsg = (TextView) view.findViewById(R.id.commentUserMsg); 
      commentUserDate = (TextView) view.findViewById(R.id.commentUserDate); 
      commentUserRemove = (TextView) view.findViewById(R.id.commentUserRemove); 
      emojiIcon = (ImageView) view.findViewById(R.id.emojiIcon); 
      Log.d(Constants.DEBUG, "IN MY VIEW HOLDER"); 

      view.setOnClickListener(this); 
      commentUserRemove.setOnClickListener(this); 

     } 

     @Override 
     public void onClick(View v) { 
      if (mOnEntryClickListener != null) { 
       Log.d(Constants.DEBUG, "IN On click"); 
       mOnEntryClickListener.onEntryClick(v, getAdapterPosition()); 

      } 
     } 
    } 
    private static OnEntryClickListener mOnEntryClickListener; 

    public interface OnEntryClickListener { 
     void onEntryClick(View view, int position); 
    } 

    public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) { 
     mOnEntryClickListener = onEntryClickListener; 
    } 


    public class MyFeatureViewHolder extends RecyclerView.ViewHolder { 
     public TextView commentCompany, commentCompanyMsg, commentCompanyDate; 
     public ImageView emojiIcon; 


      public MyFeatureViewHolder(View view) { 
      super(view); 
       commentCompany = (TextView) view.findViewById(R.id.commentCompany); 
       commentCompanyMsg = (TextView) view.findViewById(R.id.commentCompanyMsg); 
       commentCompanyDate = (TextView) view.findViewById(R.id.commentCompanyDate); 
       emojiIcon = (ImageView) view.findViewById(R.id.emojiIcon); 
       Log.d(Constants.DEBUG, "IN MY VIEW HOLDER"); 


     } 


    } 

    public CommentsAdapter(Context mContext, List<DatabaseComment> comments, Typeface myTypeface, Typeface myTypefaceItalic, Typeface myTypefaceBold) { 
     context = mContext; 
     db = new DatabaseHelper(context); 
     dbCommentsList = comments; 
     typeFace = myTypeface; 
     italicTypeface = myTypefaceItalic; 
     boldTypeface = myTypefaceBold; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType){ 
      case 0: 
       return new MyFeatureViewHolder(LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.comment_business_item, parent, false)); 
      case 1: 
       return new MyFeatureViewHolder(LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.comment_user_item, parent, false)); 
     } 
     return new MyViewHolder(LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.comment_user_item, parent, false)); 


    } 



    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

     //int pos = getItemViewType(position); 

     //is a business comment 
     if(dbCommentsList.get(position).getIsType() == 0) { 


      MyFeatureViewHolder featureViewHolder = (MyFeatureViewHolder) holder; 

      DatabaseComment dbComment = dbCommentsList.get(position); 

      featureViewHolder.commentCompany.setTypeface(boldTypeface); 
      featureViewHolder.commentCompanyMsg.setTypeface(typeFace); 
      featureViewHolder.commentCompanyDate.setTypeface(italicTypeface); 

      featureViewHolder.commentCompany.setText(dbComment.getUsername()); 
      featureViewHolder.commentCompanyMsg.setText(dbComment.getCommentText()); 

      Calendar date = Calendar.getInstance(); 
      date.setTimeInMillis(dbComment.getCommentDate()); 
      String commentDateTxt = (date.get(Calendar.MONTH) + "." + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.YEAR)); 

      featureViewHolder.commentCompanyDate.setText(commentDateTxt); 


      //anything greater than 0 is a user comment 
     } else { 
      //TODO show x button near viewHolder if isChanged is 1 

      MyViewHolder myViewHolder = (MyViewHolder) holder; 

      if(dbCommentsList.get(position).getIsChanged() == 1) { 
       myViewHolder.commentUserRemove.setVisibility(View.VISIBLE); 
      } else { 
       myViewHolder.commentUserRemove.setVisibility(View.GONE); 
      } 

      DatabaseComment dbComment = dbCommentsList.get(position); 

      myViewHolder.commentUsername.setTypeface(boldTypeface); 
      myViewHolder.commentUserMsg.setTypeface(typeFace); 
      myViewHolder.commentUserDate.setTypeface(italicTypeface); 

      myViewHolder.commentUsername.setText(dbComment.getUsername()); 
      myViewHolder.commentUserMsg.setText(dbComment.getCommentText()); 

      Calendar date = Calendar.getInstance(); 
      date.setTimeInMillis(dbComment.getCommentDate()); 
      String commentDateTxt = (date.get(Calendar.MONTH) + "." + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.YEAR)); 

      myViewHolder.commentUserDate.setText(commentDateTxt); 

      int[] commentsImageList = new int[]{R.drawable.ic_announcement_black_18dp, R.drawable.ic_announcement_black_18dp, R.drawable.ic_announcement_black_18dp, R.drawable.ic_explore_black_18dp}; 
      myViewHolder.emojiIcon.setImageResource(commentsImageList[dbComment.getIsType()]); 



     } 

     //grab more comments 
     if(position > (dbCommentsList.size() - 3) && (dbCommentsList.size() % 20) == 0) { 
      grabMoreComments(); 
     } 

    } 

    private void grabMoreComments() { 
     //TODO 
     //GRABAPI - OFFSET dbCommentsList.SIZE - IN LIMIT OF 20 
    } 



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



    @Override 
    public int getItemViewType(int position) { 
     if(dbCommentsList.get(position).getIsType() == 0) { 
      return 0; 
     } 
     return 1; 
    } 
} 

這是我的課,我安裝適配器:

private void setupAdapter() { 
     commentsAdapter = new CommentsAdapter(this, dbCommentsList, TypeFaceProvider.getTypeFace(this, 0), 
       TypeFaceProvider.getTypeFace(this, 1), TypeFaceProvider.getTypeFace(this, 2)); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     commentsRecyclerView.setLayoutManager(mLayoutManager); 
     commentsRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

     //TODO CHECK THAT CLICKING ON COMMENT BY BUSINESS NOTHING HAPPENS 

     commentsAdapter.setOnEntryClickListener(new CommentsAdapter.OnEntryClickListener() { 
      @Override 
      public void onEntryClick(View view, int position) { 
       DatabaseComment comment = dbCommentsList.get(position); 
       TextView deleteBtn = (TextView) view.findViewById(R.id.commentUserRemove); 
       if(view == deleteBtn) { 

        //used to remove the comment from db and the list 
        db.removeSingleComment(comment); 
        dbCommentsList.remove(position); 
        commentsAdapter.notifyDataSetChanged(); 

       } else { 
        Toast.makeText(getApplicationContext(), comment.getUsername() + " is selected!", Toast.LENGTH_SHORT).show(); 
        takeToUserProfile(dbCommentsList.get(position)); 
       } 
      } 
     }); 




     commentsRecyclerView.setAdapter(commentsAdapter); 

     commentsAdapter.notifyDataSetChanged(); 

    } 

所以在適配器getItemViewType沒有被正確地完成......我怎麼說,如果意見isType爲0,顯示一個視圖和其他任何節目另一種觀點?

+1

缺少檢查條件的開關...返回myViewHolder如果getViewType()返回1的視圖。稍後檢查持有者的實例是myViewHolder還是不喜歡if(持有者instanceOf MyViewHolder)然後更新視圖。 –

+0

你是什麼意思加入案件:1,我認爲默認會返回它,我試過的情況下:1雖然以及它仍然顯示錯誤 – Lion789

+1

這很好,檢查持有人在onBindViewHolder()實例。 –

回答

1

基於錯誤看起來與ID R.id.userAdapterUsername在佈局文件comment_user_item.xml

+0

我使用了錯誤的ID忘記了改變它,沒有意識到,謝謝! – Lion789

3

首先,你需要重寫你的適配器的getItemViewType象下面這樣:(我假設你可以匹配你的viewholders與對象的getType()方法。)

@Override 
    public int getItemViewType(int position) { 
     return items.get(position).getType(); 
    } 

而在你onCreateViewHolder法切換類型,並返回你的相關viewholder 。

 @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = null; 
      switch (viewType) { 
       case ITEM_TYPE_A: 
        view = mInflater.inflate(R.layout.your_row_a, parent, false); 
        return new ATypeViewHolder(view); 

       case ITEM_TYPE_B: 
        view = mInflater.inflate(R.layout.your_row_b, parent, false); 
        return new BTypeViewHolder(view); 
    } 
} 

Inıt您的適配器的onBindViewHolder方法。

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Item item = items.get(position); 
     if(item != null){ 
       initializeViews(item, holder, position); 
     } 
} 

最後在initializeViews方法根據您的項目類型,並用它投出您viewholder:

private void initializeViews(final Item item, final RecyclerView.ViewHolder viewHolder, final int position) { 
    swtich(item.gettype()) 
    { 
     case ITEM_TYPE_A: 
      ATypeViewHolder holder = (ATYpeViewHolder)viewHolder; 
      // init your views 

     case ITEM_TYPE_B: 
      BTypeViewHolder holder = (BTypeViewHolder)viewHolder; 
      // init your views. 
    } 
} 

不是:您viewholders必須擴展RecyclerView.ViewHolder

我希望這會幫助你的。祝你好運。

+0

哦,我很抱歉,這是我的私人自定義方法。你應該在onBindViewHolder方法中調用它。我編輯了我的帖子。 – savepopulation

+0

我看到你有的方法,但是這並不改變我在我自己的代碼中做的事情,你只是在onBindViewHolder之外添加了另一個方法,我已經在其中做了它? – Lion789

+0

此外,該項目上的isType可以是0或大於0 ...因此,這就是爲什麼我必須查看它是否爲0如果不返回1(因爲isType可以是0,1,2,3,4等...)但大於0應該誇大不同的看法。 – Lion789

相關問題