0

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

Uthern
  • 3
  • 1
  • Does this help? [How to create RecyclerView with multiple view types](https://stackoverflow.com/a/26245463/21017714) – Enowneb Mar 30 '23 at 06:04

1 Answers1

1

You need to override getItemViewType() method in your adapter. Also you can check here

    @Override
    public int getItemViewType(int position) {
        ChatModal item = chatsModalArrayList.get(position);
        if(item.getSender().equals("user")){
            return 0;
        }
        else {
            return 1;
        }
    }
Wooz12345
  • 159
  • 10