您好我正在开发聊天应用程序。我有两个类别运算符和访问者。取决于此类别,并在左侧或右侧显示消息,就像在典型的聊天应用程序中一样。
有人可以帮助我实现这一目标。
我试过但收到错误。
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)
当前错误在这里
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());
}
适配器
public class ChattingAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
public List<ChattingItomObject> ChattingItem;
private Context context;
public ChattingAdapter(Context context, List<ChattingItomObject> 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(); }
}
聊天活动
public class Chatting extends AppCompatActivity {
private String uniqueID;
public ChattingAdapter mAdapter;
public List<ChattingItomObject> 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<ChattingItomObject>();
// 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);
}
}
activity_chatting.xml
<?xml version="1.0" encoding="utf-8"?>
<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">
<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" />
<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" />
<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" />
</RelativeLayout>
custom_chat_visitor.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<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" />
<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" />
<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" />
</RelativeLayout>
custom_chat_operator.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<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" />
<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" />
<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" />
</RelativeLayout>
答案 0 :(得分:1)
您需要为每个布局创建两个不同的视图
private final int Operator = 0, Visitor = 1;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
switch (viewHolder.getItemViewType()) {
case Operator:
ViewHolder1 vh1 = (ViewHolder1) viewHolder;
configureViewHolder1(vh1, position);
break;
case Visitor:
ViewHolder2 vh2 = (ViewHolder2) viewHolder;
configureViewHolder2(vh2, position);
break;
}
}
private void configureViewHolder1(ViewHolder1 vh1, int position) {
vh1.visitorMessage.setText(message.getMessage());
vh1.visitortime.setText(message.getDateTime());
}
private void configureViewHolder2(ViewHolder2 vh2,int position) {
vh2.operatorMessage.setText(message.getDateTime());
vh2.operatorTime.setText(message.getDateTime());
}
@Override
public int getItemViewType(int position) {
String message_type = message.getMessageType().toString();
if(message_type.equals("Operator"))
{
return Operator;
} else {
return Visitor;
}
return -1;
}
答案 1 :(得分:0)
由于视图的回收,您获得空指针,您必须使用if(get_option('your_image')!='')
{
?>
<img src="<?php echo get_option('your_image');?>" name="your_image" id="your_image" height="100" width="100" />
<input id="bos_logo_hidden" type="hidden" name="your_image" value="<?php echo get_option('your_image');?>" style="width:500px" />
<?php
}
else
{
?>
<input id="your_image" type="text" name="your_image" value="" style="width:500px" />
<?php
}
?>
<br/><br/>
<input id="upload_image_id" type="hidden" name="upload_image_id" value="" readonly="readonly" />
<?php
if(get_option('your_image')!='')
{
?>
<input id="upload_image_button" type="button" value="Change Image" class="button-primary " />
<?php
}
else
{
?>
<input id="upload_image_button" type="button" value="Upload Image" class="button-primary" />
<?php
}
区分视图,如下所示:
getItemViewType
答案 2 :(得分:0)
if(getItemViewType != null){
if(getItemViewType(position)==5002) {
((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());
}}
但我不相信你的代码不起作用,试着清理一个项目
答案 3 :(得分:0)
我认为问题是这样,当消息类型为Operator时,你设置访问者布局的文本和ViceVersa,这个位置没有膨胀,所以android studio会返回nullPointerException。
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());
}
还在oncreateViewHolder上定义了3种可能的布局,即Operater,Visitor和Other ...布局。尝试在getItemViewType()上使用3个标识返回值,例如5001,5002,5003用于识别每个膨胀的布局。