Android 使用if语句的内部更改布局或视图
我正在尝试制作一个应用程序,使用户能够使用文本消息和音频消息进行交互。我能够发送和检索消息,但我面临的问题是,当我尝试检查接收到的消息是文本还是音频时,会收到NullPointerException。我要做的是首先检查文本类型,然后根据消息类型选择适当的布局视图。我使用了适配器,这是我的代码:Android 使用if语句的内部更改布局或视图,android,firebase-realtime-database,android-recyclerview,adapter,android-adapter,Android,Firebase Realtime Database,Android Recyclerview,Adapter,Android Adapter,我正在尝试制作一个应用程序,使用户能够使用文本消息和音频消息进行交互。我能够发送和检索消息,但我面临的问题是,当我尝试检查接收到的消息是文本还是音频时,会收到NullPointerException。我要做的是首先检查文本类型,然后根据消息类型选择适当的布局视图。我使用了适配器,这是我的代码: public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MyMessageViewHolder>{
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MyMessageViewHolder>{
private ArrayList<Messages> arrayListMessages= new ArrayList<>();
private Context mcontext;
FirebaseAuth mAuth;
private String Type = null;
public static class myAudioMessageViewHolder extends RecyclerView.ViewHolder{
TextView rec_start;
TextView rec_end;
ImageButton myPlay;
SeekBar audio_seek;
public myAudioMessageViewHolder(View itemView){
super(itemView);
rec_start = itemView.findViewById(R.id.time_elapsed);
rec_end = itemView.findViewById(R.id.finish_time);
myPlay = itemView.findViewById(R.id.play_btn);
audio_seek = itemView.findViewById(R.id.my_seekbar);
}
}
public static class MyMessageViewHolder extends RecyclerView.ViewHolder{
TextView textViewMessage;
CircleImageView UserProfile;
public MyMessageViewHolder(View itemView) {
super(itemView);
textViewMessage = itemView.findViewById(R.id.messageTextView);
UserProfile = itemView.findViewById(R.id.message_profile_layout);
}
}
public ArrayAdapter adapter;
public MessageAdapter(Context context, ArrayList<Messages> arrayListMessages){
this.arrayListMessages = arrayListMessages;
mcontext = context;
}
@Override
public MyMessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType ) {
if (Type.equals("audio")){ // This should be the determinant on the view being chosen and it should call type from database
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_message_layout, parent, false);
return new MyMessageViewHolder(view);
}else if (Type.equals("text")){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_single_layout, parent,false);
return new MyMessageViewHolder(view);
}
else {
return null;
}
}
@Override
public void onBindViewHolder(final MyMessageViewHolder holder, final int position) {
mAuth = FirebaseAuth.getInstance();
String mCurrentUser = mAuth.getCurrentUser().getUid();
final Messages messages = arrayListMessages.get(position);
String message_type = messages.getType();
String from_user = messages.getFrom();
mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(from_user);
if(mCurrentUser.equals(messages.getFrom())){
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bg_primary);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.RIGHT);
holder.textViewMessage.setTextColor(Color.WHITE);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view)
{
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}else{
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bd_white);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.LEFT);
holder.textViewMessage.setTextColor(Color.BLACK);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
adapter.notifyDataSetChanged();
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}
holder.textViewMessage.setText(messages.getMessage());
if(message_type.equals("text")) {
Type = messages.getType(); // Here i am trying to get the message type and then use it to get Inflator view of a text type
holder.textViewMessage.setText(messages.getMessage());
}
else if(message_type.equals("audio"))
{
Type = messages.getType(); // Here i am trying to get the message type and then use it to get Inflator view of a audio type
}
}
@Override
public int getItemCount() {
return arrayListMessages.size();
}
}
在设备上运行应用程序后,我出现以下错误:
FATAL EXCEPTION: main
Process: com.rescuex_za.rescuex, PID: 22285
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.rescuex_za.rescuex.MessageAdapter.onCreateViewHolder(MessageAdapter.java:92)
at com.rescuex_za.rescuex.MessageAdapter.onCreateViewHolder(MessageAdapter.java:37)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6519)
我正在从数据库中获取并检查消息。如何读取消息类型?请提供完整的细节或建议,因为我还是android开发新手,希望了解我在做什么。多谢各位
在遵循AL建议的方法之后,我没有得到我想要的观点,这是我在提问时发布的课程的更新
1.讯息类别
公共类消息{
public static final int TEXT_TYPE=0;
public static final int AUDIO_TYPE=1;
String message,type,from;
long time;
boolean seen;
int type_text;
public Messages(){
// for datashnap shot
}
public Messages(String message, String type, long time, boolean seen, String from) {
this.message = message;
this.type = type;
this.time = time;
this.seen = seen;
this.from=from;
if (type.equals("text")){
this.type_text=TEXT_TYPE;
} else if (type.equals("recording")){
this.type_text=AUDIO_TYPE;
}
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public boolean isSeen() {
return seen;
}
public void setSeen(boolean seen) {
this.seen = seen;
}
}
这是我的适配器类
public class MessageAdapter extends
RecyclerView.Adapter<MessageAdapter.MyMessageViewHolder>{
private ArrayList<Messages> arrayListMessages= new ArrayList<>();
private Context mcontext;
FirebaseAuth mAuth;
private DatabaseReference mUserDatabase;
private ViewGroup parent;
public static class myAudioMessageViewHolder extends MyMessageViewHolder{
TextView rec_start;
TextView rec_end;
ImageButton myPlay;
SeekBar audio_seek;
public myAudioMessageViewHolder(View itemView){
super(itemView);
rec_start = itemView.findViewById(R.id.time_elapsed);
rec_end = itemView.findViewById(R.id.finish_time);
myPlay = itemView.findViewById(R.id.play_btn);
audio_seek = itemView.findViewById(R.id.my_seekbar);
}
}
public static class MyMessageViewHolder extends RecyclerView.ViewHolder{
TextView textViewMessage;
CircleImageView UserProfile;
public MyMessageViewHolder(View itemView) {
super(itemView);
textViewMessage = itemView.findViewById(R.id.messageTextView);
UserProfile = itemView.findViewById(R.id.message_profile_layout);
}
}
public ArrayAdapter adapter;
public MessageAdapter(Context context, ArrayList<Messages> arrayListMessages){
this.arrayListMessages = arrayListMessages;
mcontext = context;
}
@Override
public MyMessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType ) {
View view;
switch (viewType) {
case Messages.TEXT_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_single_layout, parent, false);
return new myAudioMessageViewHolder(view);
case Messages.AUDIO_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_message_layout, parent, false);
return new MyMessageViewHolder(view);
}
return null;
}
@Override
public int getItemViewType(int position) {
switch (arrayListMessages.get(position).type_text) {
case 0:
return Messages.TEXT_TYPE;
case 1:
return Messages.AUDIO_TYPE;
default:
return -1;
}
}
@Override
public void onBindViewHolder(final MyMessageViewHolder holder, final int position) {
mAuth = FirebaseAuth.getInstance();
String mCurrentUser = mAuth.getCurrentUser().getUid();
final Messages messages = arrayListMessages.get(position);
String message_type = messages.getType();
String from_user = messages.getFrom();
mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(from_user);
if(mCurrentUser.equals(messages.getFrom())){
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bg_primary);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.RIGHT);
holder.textViewMessage.setTextColor(Color.WHITE);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view)
{
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}else{
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bd_white);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.LEFT);
holder.textViewMessage.setTextColor(Color.BLACK);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
adapter.notifyDataSetChanged();
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}
holder.textViewMessage.setText(messages.getMessage());
if(message_type.equals("text")) {
// Here i am trying to get the message type and then use it to get Inflator view of a text type
holder.textViewMessage.setText(messages.getMessage());
}
else if(message_type.equals("recording"))
{
// Here i am trying to get the message type and then use it to get Inflator view of a audio type
}
}
@Override
public int getItemCount() {
return arrayListMessages.size();
}
}
公共类MessageAdapter扩展
RecyclerView.适配器{
私有ArrayList arrayListMessages=新ArrayList();
私有上下文;
FirebaseAuth mAuth;
私人数据库参考博物馆数据库;
私有视图组父级;
公共静态类myAudioMessageViewHolder扩展了MyMessageViewHolder{
文本视图记录启动;
文本视图记录结束;
我的游戏;
SeekBar音频搜索;
公共myAudioMessageViewHolder(查看项目视图){
超级(项目视图);
rec\u start=itemView.findviewbyd(R.id.time\u经过的时间);
rec_end=itemView.findviewbyd(R.id.finish_time);
myPlay=itemView.findviewbyd(R.id.play\u btn);
audio\u seek=itemView.findviewbyd(R.id.my\u seekbar);
}
}
公共静态类MyMessageViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本视图消息;
CircleImageView用户配置文件;
公共MyMessageViewHolder(查看项目视图){
超级(项目视图);
textViewMessage=itemView.findViewById(R.id.messageTextView);
UserProfile=itemView.findviewbyd(R.id.message\u profile\u布局);
}
}
公共阵列适配器;
公共消息适配器(上下文上下文,ArrayList arrayListMessages){
this.arrayListMessages=arrayListMessages;
mcontext=上下文;
}
@凌驾
public MyMessageViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图;
开关(视图类型){
case Messages.TEXT\u类型:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.message\u single\u布局,parent,false);
返回新的myAudioMessageViewHolder(视图);
案例消息。音频类型:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.audio\u message\u布局,parent,false);
返回新的MyMessageViewHolder(视图);
}
返回null;
}
@凌驾
public int getItemViewType(int位置){
开关(arrayListMessages.get(position).type_text){
案例0:
返回消息。文本类型;
案例1:
返回消息。音频类型;
违约:
返回-1;
}
}
@凌驾
public void onBindViewHolder(最终MyMessageViewHolder,最终int位置){
mAuth=FirebaseAuth.getInstance();
字符串mCurrentUser=mAuth.getCurrentUser().getUid();
final Messages=arrayListMessages.get(位置);
字符串message_type=messages.getType();
字符串from_user=messages.getFrom();
mUserDatabase=FirebaseDatabase.getInstance().getReference().child(“用户”).child(来自用户);
if(mCurrentUser.equals(messages.getFrom())){
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bg_primary);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.RIGHT);
holder.textViewMessage.setTextColor(Color.WHITE);
holder.textViewMessage.setOnLongClickListener(新视图.OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图)
{
CharSequence选项[]=新的CharSequence[]{“删除”,“复制文本”};
final AlertDialog.Builder=新建AlertDialog.Builder(mcontext);
builder.setTitle(“选择选项”);
setItems(选项,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
//单击每个项目的事件。
如果(i==0){
字符串selectedItem=messages.getMessage();
arrayListMessages.remove(选择editem);
Toast.makeText(mcontext,“消息已删除”,Toast.LENGTH_SHORT.show();
}
如果(i==1)
{
ClipboardManager cm=(ClipboardManager)mcontext.getSystemService(Context.CLIPBOARD\u服务);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext,“复制到剪贴板”,Toast.LENGTH_SHORT.show();
}
}
});
builder.show();
返回true;
}
});
}否则{
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bd_white);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.LEFT);
holder.textViewMessage.setTextColor(Color.BLACK);
holder.textViewMessage.setOnLongClickListener(新视图.OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图){
CharSequence选项[]=新的CharSequence[]{“删除”,“复制文本”};
final AlertDialog.Builder=新建AlertDialog.Builder(mcontext);
日分
public class MessageAdapter extends
RecyclerView.Adapter<MessageAdapter.MyMessageViewHolder>{
private ArrayList<Messages> arrayListMessages= new ArrayList<>();
private Context mcontext;
FirebaseAuth mAuth;
private DatabaseReference mUserDatabase;
private ViewGroup parent;
public static class myAudioMessageViewHolder extends MyMessageViewHolder{
TextView rec_start;
TextView rec_end;
ImageButton myPlay;
SeekBar audio_seek;
public myAudioMessageViewHolder(View itemView){
super(itemView);
rec_start = itemView.findViewById(R.id.time_elapsed);
rec_end = itemView.findViewById(R.id.finish_time);
myPlay = itemView.findViewById(R.id.play_btn);
audio_seek = itemView.findViewById(R.id.my_seekbar);
}
}
public static class MyMessageViewHolder extends RecyclerView.ViewHolder{
TextView textViewMessage;
CircleImageView UserProfile;
public MyMessageViewHolder(View itemView) {
super(itemView);
textViewMessage = itemView.findViewById(R.id.messageTextView);
UserProfile = itemView.findViewById(R.id.message_profile_layout);
}
}
public ArrayAdapter adapter;
public MessageAdapter(Context context, ArrayList<Messages> arrayListMessages){
this.arrayListMessages = arrayListMessages;
mcontext = context;
}
@Override
public MyMessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType ) {
View view;
switch (viewType) {
case Messages.TEXT_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_single_layout, parent, false);
return new myAudioMessageViewHolder(view);
case Messages.AUDIO_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_message_layout, parent, false);
return new MyMessageViewHolder(view);
}
return null;
}
@Override
public int getItemViewType(int position) {
switch (arrayListMessages.get(position).type_text) {
case 0:
return Messages.TEXT_TYPE;
case 1:
return Messages.AUDIO_TYPE;
default:
return -1;
}
}
@Override
public void onBindViewHolder(final MyMessageViewHolder holder, final int position) {
mAuth = FirebaseAuth.getInstance();
String mCurrentUser = mAuth.getCurrentUser().getUid();
final Messages messages = arrayListMessages.get(position);
String message_type = messages.getType();
String from_user = messages.getFrom();
mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(from_user);
if(mCurrentUser.equals(messages.getFrom())){
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bg_primary);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.RIGHT);
holder.textViewMessage.setTextColor(Color.WHITE);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view)
{
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}else{
holder.textViewMessage.setBackgroundResource(R.drawable.custom_message_bd_white);
holder.textViewMessage.setTextIsSelectable(true);
holder.textViewMessage.setGravity(Gravity.LEFT);
holder.textViewMessage.setTextColor(Color.BLACK);
holder.textViewMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
CharSequence options[] = new CharSequence[]{"Delete", "Copy Text"};
final AlertDialog.Builder builder = new AlertDialog.Builder(mcontext);
builder.setTitle("Select Options");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Click Event for each item.
if (i == 0) {
String selectedItem = messages.getMessage();
arrayListMessages.remove(selectedItem);
adapter.notifyDataSetChanged();
Toast.makeText(mcontext, "Message deleted", Toast.LENGTH_SHORT).show();
}
if (i == 1)
{
ClipboardManager cm = (ClipboardManager) mcontext.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(holder.textViewMessage.getText());
Toast.makeText(mcontext, "Copied to clipboard", Toast.LENGTH_SHORT).show();
}
}
});
builder.show();
return true;
}
});
}
holder.textViewMessage.setText(messages.getMessage());
if(message_type.equals("text")) {
// Here i am trying to get the message type and then use it to get Inflator view of a text type
holder.textViewMessage.setText(messages.getMessage());
}
else if(message_type.equals("recording"))
{
// Here i am trying to get the message type and then use it to get Inflator view of a audio type
}
}
@Override
public int getItemCount() {
return arrayListMessages.size();
}
}