TypeHolder 中的 ClassCastException Android
ClassCastException in TypeHolder Android
我制作了一个 ListView
并且我想根据 iMsg
和 uMsg
的值扩充不同的 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)
我编辑了我之前的答案,因为它不是答案。我看到问题是关于 ListView
但无论如何,由于这些天我主要使用 RecyclerView
,所以我想出了 RecyclerView
的解决方案。
这里需要重写getViewTypeCount
方法。 Android 如果你不定义它们,系统不知道有不同的视图类型。
你也可以看看this answer。答案本身不会覆盖 getViewTypeCount
。您需要显式实现此方法,并且 return 2
因为您有两个不同的 ViewHolder
。
您也可以看一下 this answer,它使用 getViewTypeCount
实现了自定义适配器以获得想法。
我制作了一个 ListView
并且我想根据 iMsg
和 uMsg
的值扩充不同的 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)
我编辑了我之前的答案,因为它不是答案。我看到问题是关于 ListView
但无论如何,由于这些天我主要使用 RecyclerView
,所以我想出了 RecyclerView
的解决方案。
这里需要重写getViewTypeCount
方法。 Android 如果你不定义它们,系统不知道有不同的视图类型。
你也可以看看this answer。答案本身不会覆盖 getViewTypeCount
。您需要显式实现此方法,并且 return 2
因为您有两个不同的 ViewHolder
。
您也可以看一下 this answer,它使用 getViewTypeCount
实现了自定义适配器以获得想法。