i'm trying to implement brainshop AI API into my android studio application to output response from the chatbot to the user's input or question but i am getting this java.lang.ClassCastException.
ERROR java.lang.ClassCastException: com.android.smartpoly.MessageRVAdapter$UserViewHolder cannot be cast to com.android.smartpoly.MessageRVAdapter$BotViewHolder
MainActivity.java
package com.android.smartpoly;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.io.*;
import java.util.ArrayList;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
import com.google.firebase.auth.FirebaseAuth;
import okhttp3.Request;
import okio.Timeout;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
FirebaseAuth auth;
TextView usernameTxt;
Button signOutbtn;
private RecyclerView chatsRV;
private ImageButton sendMsgIB;
private EditText userMsgEdt;
private final String USER_KEY = "user";
private final String BOT_KEY = "bot";
// creating a variable for
// our volley request queue.
private RequestQueue mRequestQueue;
// creating a variable for array list and adapter class.
private ArrayList<ChatModal> chatModalArrayList;
private MessageRVAdapter messageRVAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNav = (BottomNavigationView) findViewById(R.id.bottom_nav);
// Set Selected Id
bottomNav.setSelectedItemId(R.id.chatbot);
Menu menu=bottomNav.getMenu();
auth=FirebaseAuth.getInstance();
signOutbtn=(Button)findViewById(R.id.signOut);
usernameTxt=(TextView)findViewById(R.id.username);
// on below line we are initializing all our views.
chatsRV = findViewById(R.id.idRVChats);
sendMsgIB = findViewById(R.id.idIBSend);
userMsgEdt = findViewById(R.id.idEdtMessage);
// below line is to initialize our request queue.
mRequestQueue = Volley.newRequestQueue(MainActivity.this);
mRequestQueue.getCache().clear();
// creating a new array list
chatModalArrayList = new ArrayList<>();
if (auth!=null)
{
String currentUser=auth.getCurrentUser().getEmail();
usernameTxt.setText(currentUser);
logout();
}
// on below line we are initializing our adapter class and passing our array list to it.
messageRVAdapter = new MessageRVAdapter(chatModalArrayList, this);
// below line we are creating a variable for our linear layout manager.
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
// below line is to set layout
// manager to our recycler view.
chatsRV.setLayoutManager(linearLayoutManager);
// below line we are setting
// adapter to our recycler view.
chatsRV.setAdapter(messageRVAdapter);
// adding on click listener for send message button.
sendMsgIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// checking if the message entered
// by user is empty or not.
if (userMsgEdt.getText().toString().isEmpty()) {
// if the edit text is empty display a toast message.
Toast.makeText(MainActivity.this, "Please enter your message..", Toast.LENGTH_SHORT).show();
return;
}
// calling a method to send message
// to our bot to get response.
getResponse(userMsgEdt.getText().toString());
// below line we are setting text in our edit text as empty
userMsgEdt.setText("");
}
});
bottomNav.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.introduction:
Intent intro = new Intent(MainActivity.this, Intro.class);
startActivity(intro);
break;
case R.id.activity:
Intent activity = new Intent(MainActivity.this, Activities.class);
startActivity(activity);
break;
case R.id.chatbot:
break;
case R.id.staff:
Intent staff = new Intent(MainActivity.this, Staff.class);
startActivity(staff);
break;
case R.id.aboutus:
Intent aboutus = new Intent(MainActivity.this, AboutUs.class);
startActivity(aboutus);
break;
}
return true;
}
});
}
private void logout()
{
signOutbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
auth.signOut();
startActivity(new Intent(MainActivity.this, AuthActivity.class));
finish();
}
});
}
private void getResponse (String message) {
chatModalArrayList.add(new ChatModal(message, USER_KEY));
messageRVAdapter.notifyDataSetChanged();
String url= "http://api.brainshop.ai/get?bid=174120&key=KwxcDibecKUNMRyr&uid=[uid]&msg=[msg]";
String BASE_URL="http://api.brainshop.ai/";
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetroAPI retrofitAPI=retrofit.create(RetroAPI.class);
Call<MsgModal> call=retrofitAPI.getMessage(url);
call.enqueue(new Callback<MsgModal>() {
@Override
public void onResponse(Call<MsgModal> call, Response<MsgModal> response) {
if(response.isSuccessful()) {
MsgModal modal=response.body();
chatModalArrayList.add(new ChatModal(modal.getCnt(), BOT_KEY));
messageRVAdapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(Call<MsgModal> call, Throwable t) {
chatModalArrayList.add(new ChatModal("Please revert your question", BOT_KEY));
messageRVAdapter.notifyDataSetChanged();
}
});
}
}
MessageRVAdapter.java
package com.android.smartpoly;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MessageRVAdapter extends RecyclerView.Adapter {
private ArrayList<ChatModal> chatsModalArrayList;
private Context context;
public MessageRVAdapter(ArrayList<ChatModal> chatsModalArrayList, Context context) {
this.chatsModalArrayList = chatsModalArrayList;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 0:
view=LayoutInflater.from(parent.getContext()).inflate(R.layout.user_msg, parent, false);
return new UserViewHolder(view);
case 1 :
view=LayoutInflater.from(parent.getContext()).inflate(R.layout.bot_msg, parent, false);
return new BotViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ChatModal chatsModal=chatsModalArrayList.get(position);
switch (chatsModal.getSender()) {
case "user":
((UserViewHolder)holder).userTV.setText(chatsModal.getMessage());
break;
case "bot" :
((BotViewHolder)holder).botMsgTV.setText(chatsModal.getMessage());
break;
}
}
@Override
public int getItemCount() {
return chatsModalArrayList.size();
}
public static class UserViewHolder extends RecyclerView.ViewHolder {
TextView userTV;
public UserViewHolder(@NonNull View itemView) {
super(itemView);
userTV=itemView.findViewById(R.id.TVUser);
}
}
public static class BotViewHolder extends RecyclerView.ViewHolder {
TextView botMsgTV;
public BotViewHolder(@NonNull View itemView) {
super(itemView);
botMsgTV=itemView.findViewById(R.id.TVBot);
}
}
}
MsgModal.java
package com.android.smartpoly;
public class MsgModal {
private String cnt;
public String getCnt() {
return cnt;
}
public void setCnt(String cnt) {
this.cnt=cnt;
}
public MsgModal(String cnt) {
this.cnt=cnt;
}
}
ChatModal.java
package com.android.smartpoly;
public class ChatModal {
// string to store our message and sender
private String message;
private String sender;
// constructor.
public ChatModal(String message, String sender) {
this.message = message;
this.sender = sender;
}
// getter and setter methods.
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
}
I am new to programming and hoping someone can help me fix it