title: Switching layout inside the recyclerview for chat application
body: <p>Hi i am developing a chat application.I have two categories <strong>Operator</strong> and <strong>Visitor</strong>. depending on this category and display the messages in left or right side like in a typical chat application.</p>
  
  <p>Can some one help me to achieve this. </p>
  
  <p>I tried but getting an error. </p>
  
  <pre><code>FATAL EXCEPTION: main
  Process: zupportdesk.desk.zupport.chatsystem, PID: 31103
  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
  at zupportdesk.desk.zupport.chatsystem.Data.ChattingAdapter.onBindViewHolder(ChattingAdapter.java:66)
  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5822)
  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5855)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5091)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4967)
  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:578)
  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3315)
  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3124)
  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3568)
  at android.view.View.layout(View.java:16636)
  at android.view.ViewGroup.layout(ViewGroup.java:5437)
  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
  at android.view.View.layout(View.java:16636)
  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:16636)
  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:16636)
  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:16636)
  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:16636)
  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:2678)
  at android.view.View.layout(View.java:16636)
  at android.view.ViewGroup.layout(ViewGroup.java:5437)
  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2179)
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1939)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
  at android.view.Choreographer.doCallbacks(Choreographer.java:670)
  at android.view.Choreographer.doFrame(Choreographer.java:606)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5422)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  </code></pre>
  
  <p><strong>current error is here</strong></p>
  
  <pre><code>if(message_type.equals("Operator")) {
              ((ViewHolder) holder).visitorMessage.setText(message.getMessage());
              ((ViewHolder) holder).visitortime.setText(message.getDateTime());
          } else {
              ((ViewHolder) holder).operatorMessage.setText(message.getDateTime());
              ((ViewHolder) holder).operatorTime.setText(message.getDateTime());
          }
  </code></pre>
  
  <p><strong>Adapter</strong></p>
  
  <pre><code>public class ChattingAdapter extends RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt;{
  
      public List&lt;ChattingItomObject&gt; ChattingItem;
      private Context context;
  
      public ChattingAdapter(Context context, List&lt;ChattingItomObject&gt; items){
          this.ChattingItem = items;
          this.context = context;
      }
  
      public class ViewHolder extends RecyclerView.ViewHolder {
          public TextView operatorMessage;
          public TextView operatorTime;
          public TextView visitorMessage;
          public TextView visitortime;
  
          public ViewHolder(View view) {
              super(view);
              operatorMessage = (TextView) view.findViewById(R.id.CCO_message);
              operatorTime = (TextView) view.findViewById(R.id.CCo_time);
  
              visitorMessage = (TextView) view.findViewById(R.id.CCV_message);
              visitortime = (TextView) view.findViewById(R.id.CCV_time);
          }
      }
  
      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          View itemView;
  
          if (viewType == 5001) {
              // self message
              itemView = LayoutInflater.from(parent.getContext())
                      .inflate(R.layout.custom_chat_operator, parent, false);
          } else if(viewType == 5002) {
              // others message
              itemView = LayoutInflater.from(parent.getContext())
                      .inflate(R.layout.custom_chat_visitor, parent, false);
          }else {
              itemView = LayoutInflater.from(parent.getContext())
                      .inflate(R.layout.custom_chat_other, parent, false);
          }
          return new ViewHolder(itemView);
      }
  
      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
          ChattingItomObject message = ChattingItem.get(position);
          String message_type = message.getMessageType().toString();
  
          if(message_type.equals("Operator")) {
              ((ViewHolder) holder).visitorMessage.setText(message.getMessage());
              ((ViewHolder) holder).visitortime.setText(message.getDateTime());
          } else {
              ((ViewHolder) holder).operatorMessage.setText(message.getDateTime());
              ((ViewHolder) holder).operatorTime.setText(message.getDateTime());
          }
      }
  
      @Override
      public int getItemViewType(int position) {
          String message = ChattingItem.get(position).getMessageType();
          if (message.equals("Operator")) {
              return 5001;
          } else if(message.equals("Visitor")){
              return 5002;
          }
  
          return position;
      }
  
      @Override
      public int getItemCount() { return ChattingItem.size(); }
  }
  </code></pre>
  
  <p><strong>Chatting Activity</strong></p>
  
  <pre><code>public class Chatting extends AppCompatActivity {
  
      private String  uniqueID;
      public ChattingAdapter mAdapter;
      public List&lt;ChattingItomObject&gt; messageItems;
      private RecyclerView recyclerView;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_chatting);
  
  
          uniqueID = UUID.randomUUID().toString();
          Log.d("GUIID", uniqueID);
  
          messageItems = new ArrayList&lt;ChattingItomObject&gt;();
          // add some items to list to test
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Operator", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Visitor", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Operator", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Visitor", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Operator", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Operator", uniqueID));
          messageItems.add(new ChattingItomObject("VisitorID", "Message", "10:30 pm", "OperatorType", "UserName", "Visitor", uniqueID));
  
  
  
          recyclerView = (RecyclerView) findViewById(R.id.recycler_chat);
          mAdapter = new ChattingAdapter(this, messageItems);
  
          LinearLayoutManager layoutManager = new LinearLayoutManager(this);
          recyclerView.setLayoutManager(layoutManager);
          recyclerView.setItemAnimator(new DefaultItemAnimator());
          recyclerView.setAdapter(mAdapter);
  
      }
  
  }
  </code></pre>
  
  <p><strong>activity_chatting.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      tools:context="zupportdesk.desk.zupport.chatsystem.Chatting"&gt;
  
      &lt;android.support.v7.widget.RecyclerView
          android:id="@+id/recycler_chat"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_alignParentTop="true"
          android:layout_centerHorizontal="true"
          android:scrollbars="none" /&gt;
  
  
      &lt;EditText
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:textColorHint="#CFD8DC"
          android:textColor="#CFD8DC"
          android:hint="Write a message"
          android:id="@+id/editText"
          android:layout_alignParentBottom="true"
          android:layout_alignParentLeft="true"
          android:layout_alignParentStart="true"
          android:layout_toLeftOf="@+id/imageView5"
          android:layout_toStartOf="@+id/imageView5" /&gt;
  
      &lt;ImageView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="5"
          android:padding="4dp"
          android:src="@android:drawable/ic_menu_send"
          android:id="@+id/imageView5"
          android:layout_alignBottom="@+id/editText"
          android:layout_alignParentRight="true"
          android:layout_alignParentEnd="true" /&gt;
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <p><strong>custom_chat_visitor.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" android:layout_width="match_parent"
      android:layout_height="match_parent"&gt;
  
  
      &lt;ImageView
          android:id="@+id/imageView4"
          android:layout_width="30dp"
          android:layout_height="30dp"
          android:layout_weight="1"
          android:src="@drawable/arrow_bg2"
          android:layout_above="@+id/CCV_time"
          android:layout_alignParentLeft="true"
          android:layout_alignParentStart="true" /&gt;
  
      &lt;TextView
          android:id="@+id/CCV_message"
          android:layout_width="300dp"
          android:layout_height="wrap_content"
          android:layout_weight="6"
          android:background="@drawable/chat_visitor"
          android:padding="16dp"
          android:text="Android charting application xml ui design. "
          android:textColor="#000"
          android:layout_alignParentTop="true"
          android:layout_toRightOf="@+id/imageView4"
          android:layout_toEndOf="@+id/imageView4"
          android:layout_marginTop="5dp" /&gt;
  
      &lt;TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="New Text"
          android:id="@+id/CCV_time"
          android:textSize="8dp"
          android:layout_alignBottom="@+id/CCV_message"
          android:layout_toRightOf="@+id/imageView4"
          android:layout_toEndOf="@+id/imageView4"
          android:layout_marginLeft="16dp"
          android:layout_marginStart="16dp"
          android:layout_marginBottom="2dp" /&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <p><strong>custom_chat_operator.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" android:layout_width="match_parent"
      android:layout_height="match_parent"&gt;
  
  
      &lt;TextView
          android:id="@+id/CCO_message"
          android:layout_width="300dp"
          android:layout_height="wrap_content"
          android:layout_weight="6"
          android:background="@drawable/chat_operator"
          android:padding="16dp"
          android:text=" AndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAndAnd"
          android:textColor="#000"
          android:layout_alignParentTop="true"
          android:layout_alignRight="@+id/imageView3"
          android:layout_alignEnd="@+id/imageView3"
          android:layout_marginRight="20dp"
          android:layout_marginEnd="15dp"
          android:layout_marginTop="5dp" /&gt;
  
      &lt;ImageView
          android:id="@+id/imageView3"
          android:layout_width="30dp"
          android:layout_height="30dp"
          android:layout_weight="1"
          android:src="@drawable/arrow_bg1"
          android:layout_alignBottom="@+id/CCO_message"
          android:layout_alignParentRight="true"
          android:layout_alignParentEnd="true"
          android:layout_marginBottom="15dp" /&gt;
  
      &lt;TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="10:30 PM"
          android:id="@+id/CCo_time"
          android:textSize="8dp"
          android:layout_alignBottom="@+id/CCO_message"
          android:layout_toLeftOf="@+id/imageView3"
          android:layout_toStartOf="@+id/imageView3"
          android:layout_marginBottom="2dp" /&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>