【问题标题】:ClassCastException in TypeHolder AndroidTypeHolder Android 中的 ClassCastException
【发布时间】:2017-01-01 03:55:39
【问题描述】:

我已经创建了一个ListView,我想根据iMsguMsg 的值来扩展不同的xml 文件(其中一个将始终为空,所以另一个应该被扩展)。

我有 2 个 xml 文件。两者都有一个 TextView 具有不同的样式。代码转换为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)

【问题讨论】:

  • 如果您可以将异常堆栈跟踪附加到您的问题中,这将有所帮助。

标签: android classcastexception convertview


【解决方案1】:

我编辑了我之前的答案,因为它不是答案。我看到问题是关于ListView,但无论如何,由于这些天我主要与RecyclerView 一起工作,我想出了RecyclerView 的解决方案。

这里你需要重写getViewTypeCount 方法。如果不定义,Android系统不知道有不同的视图类型。

你也可以看看this answer。答案本身不会覆盖getViewTypeCount。您需要显式地实现此方法并使用return 2,因为您有两个不同的ViewHolder

您也可以查看this answer,它使用getViewTypeCount 实现了一个自定义适配器来了解一下。

【讨论】:

  • 好的,因为它们正在扩展同一个类,所以它们不会是 ClassCastException。但是在扩展时......它让我可以选择扩展为 RecylerView.ViewHolder......你想让我这样做吗?因为那时它要求一个构造函数。
  • 它工作了......我使用 getViewTypeCount 返回 2 和 getItemViewType 并根据条件返回 0 或 1,它工作......
  • 很高兴知道这有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多