ClassCastException в TypeHolder Android

Я сделалListView, и я хочу, чтобы надуть различные xml-файл в зависимости от значения iMsgand uMsg(один из них всегда будет пустым, поэтому другой должен быть надут).

Есть 2 xml-файлов у меня есть. Оба имеют TextViewразный стиль. Код приводит a ClassCastException. Я прочитал в ответе на другой вопрос, чтобы переопределить getViewTypeCount()метод. Но я не совсем понял. Может кто-нибудь помочь?

public class ChatAdapter extends ArrayAdapter<Chatmsg>{
    public ChatAdapter(Context context, ArrayList<Chatmsg> messages) {
        super(context,0,messages);
    }

    public static class iViewHolder{
        TextView imsg;
    }
    public static class uViewHolder{
        TextView umsg;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        Chatmsg chatmsg = getItem(position);
        View v = null;

        if(chatmsg.getuMsg()== null) {
            iViewHolder iviewHolder;
            v = convertView;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.pc_custom_row_i, parent, false);

                iviewHolder = new iViewHolder();
                iviewHolder.imsg = (TextView) v.findViewById(R.id.iMessage);
                v.setTag(iviewHolder);
            } else {
                iviewHolder = (iViewHolder) v.getTag();
            }

            iviewHolder.imsg.setText(chatmsg.getiMsg());

        } else {
                uViewHolder uviewHolder;
                v = convertView;

                if(v== null){
                    LayoutInflater vi1 = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi1.inflate(R.layout.pc_custom_row_u,parent,false);
                    uviewHolder = new uViewHolder();
                    uviewHolder.umsg = (TextView) v.findViewById(R.id.uMessage);
                    v.setTag(uviewHolder);

                } else {
                    uviewHolder = (uViewHolder) v.getTag();
                }

                uviewHolder.umsg.setText(chatmsg.getuMsg());
        }

        return v;
    }
}

Вот журнал:

E/AndroidRuntime:   
FATAL EXCEPTION: main Process: in.techxator.zero.zero_chat, PID: 28876  
java.lang.ClassCastException:in.techxator.zero.zero_chat.ChatAdapter$iViewHolder cannot be cast to in.techxator.zero.zero_chat.ChatAdapter$uViewHolder at in.techxator.zero.zero_chat.ChatAdapter.getView(ChatAdapter.java:120)

1 ответ

  1. Я отредактировал свой предыдущий ответ, так как он не был ответом. Я видел, что вопрос о ListViewтом, но в любом случае, так как я работаю в основном с RecyclerViewэтими днями, я придумал решение для RecyclerView.

    Здесь вам нужно переопределить getViewTypeCountметод. Система Android не знает, что существуют различные типы представления, если вы не определяете их.

    Вы также можете взглянуть на этот ответ. Сам ответ не переопределяет getViewTypeCount. Вам нужно реализовать этот метод явно и return 2как у вас есть два разных ViewHolder.

    Вы можете взглянуть на этот ответ тоже, который реализует пользовательский адаптер сgetViewTypeCount, чтобы получить идею.