继承ArrayAdapter,重写getView时,convertView setTag与holder里addTextChangedListener同时存在出错

zjingsh90 2012-07-13 02:31:29
写了一个用gridView弄的课程表,因为item要可编辑,所以item里就一个EditText;
继承ArrayAdapter,ViewHolder只有EditText edit一个成员。
下面是getView 部分内容
ViewHolder holder = null;
if (convertView ==null){
holder = new ViewHolder();
LayoutInflater mInflater = LayoutInflater.from(context);
convertView = mInflater.inflate(R.layout.grid_item, null);
holder.edit = (EditText)convertView.findViewById(R.id.edit);
holder.edit.setTag(position);
class MyEditWatcher implements TextWatcher{
public MyEditWatcher(ViewHolder holder){
mHolder = holder;
}
private ViewHolder mHolder;
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
int pos = (Integer)mHolder.edit.getTag();
objects.set(pos, s.toString());
}

public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub

}

public void onTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub

}

}
holder.edit.addTextChangedListener(new MyEditWatcher(holder));
convertView.setTag(holder);
holder.edit.setText(objects.get(position).toString());
System.out.println("Suceed!");
经过测试,是在红色字体部分出错的,问题应该是出在MyEditWatche上,求高手帮忙解决一下,谢谢!
...全文
499 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AMinfo 2012-07-15
  • 打赏
  • 举报
回复
学会调试很重要,既然提示你说整形转换失败,在
int pos = (Integer)mHolder.edit.getTag();
前面加一行
Log.i("调试", "Tag=" + mHolder.edit.getTag() + "。");

然后将输出结果发上来看一下。
zjingsh90 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
学会调试很重要,既然提示你说整形转换失败,在
int pos = (Integer)mHolder.edit.getTag();
前面加一行
Log.i("调试", "Tag=" + mHolder.edit.getTag() + "。");

然后将输出结果发上来看一下。
[/Quote]
谢谢! 确实是这里有问题,由调试找出问题所在了。
zjingsh90 2012-07-14
  • 打赏
  • 举报
回复
置顶一下,求大神指点
RDroid 2012-07-14
  • 打赏
  • 举报
回复
07-13 13:52:53.065: E/AndroidRuntime(936): java.lang.ClassCastException: hill.Gridtest.EditTextAdapter$ViewHolder cannot be cast to java.lang.Integer
07-13 13:52:53.065: E/AndroidRuntime(936): at hill.Gridtest.EditTextAdapter$1MyEditWatcher.afterTextChanged(EditTextAdapter.java:59)

很明显,你在不同的地方,给 mHolder.edit 分别set了 ViewHolder和Integer类型 的tag
zjingsh90 2012-07-14
  • 打赏
  • 举报
回复
07-13 13:52:53.065: E/AndroidRuntime(936): java.lang.ClassCastException: hill.Gridtest.EditTextAdapter$ViewHolder cannot be cast to java.lang.Integer
07-13 13:52:53.065: E/AndroidRuntime(936): at hill.Gridtest.EditTextAdapter$1MyEditWatcher.afterTextChanged(EditTextAdapter.java:59)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.TextView.sendAfterTextChanged(TextView.java:7591)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.TextView.setText(TextView.java:3268)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.TextView.setText(TextView.java:3110)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.EditText.setText(EditText.java:78)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.TextView.setText(TextView.java:3085)
07-13 13:52:53.065: E/AndroidRuntime(936): at hill.Gridtest.EditTextAdapter.getView(EditTextAdapter.java:86)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.AbsListView.obtainView(AbsListView.java:2033)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.GridView.onMeasure(GridView.java:1026)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.View.measure(View.java:12603)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.View.measure(View.java:12603)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.View.measure(View.java:12603)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.View.measure(View.java:12603)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-13 13:52:53.065: E/AndroidRuntime(936): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.View.measure(View.java:12603)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.os.Looper.loop(Looper.java:137)
07-13 13:52:53.065: E/AndroidRuntime(936): at android.app.ActivityThread.main(ActivityThread.java:4340)
07-13 13:52:53.065: E/AndroidRuntime(936): at java.lang.reflect.Method.invokeNative(Native Method)
07-13 13:52:53.065: E/AndroidRuntime(936): at java.lang.reflect.Method.invoke(Method.java:511)
07-13 13:52:53.065: E/AndroidRuntime(936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-13 13:52:53.065: E/AndroidRuntime(936): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-13 13:52:53.065: E/AndroidRuntime(936): at dalvik.system.NativeStart.main(Native Method)
zjingsh90 2012-07-14
  • 打赏
  • 举报
回复
我edit的settag是int类型,然后convertview settag了holder。
hvk687 2012-07-13
  • 打赏
  • 举报
回复
log中的错误是什么?空指针?
zjingsh90 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

Integer不能直接赋值给int的,一个是对象,一个是基本数据类型
[/Quote]
JDK1.5不是提供了拆装箱吗?
可能我没说清楚,我遇到的情况是:
单独的holder.edit.addTextChangedListener(new MyEditWatcher(holder));
或者convertView.setTag(holder);
都没有问题,但是两个同时存在就会出错。
我觉得是tag里的holder里的edit中得textchangedlistener问题,settext会触发这个监听器。
hvk687 2012-07-13
  • 打赏
  • 举报
回复
Integer不能直接赋值给int的,一个是对象,一个是基本数据类型
zjingsh90 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

要发详细出错提示上来才知道什么原因

另外,这句
holder.edit.setText(objects.get(position).toString());
最好要加上一个判断
if(position<objects.size())
{
holder.edit.setText(objects.get(position).toString());
}
[/Quote]
在第一次使用getview时就已经出错了,另外一大堆runtime,第一个显示为ViewHolder不能转为Integer
为此处:int pos = (Integer)mHolder.edit.getTag();但此处并无问题啊。
AMinfo 2012-07-13
  • 打赏
  • 举报
回复
要发详细出错提示上来才知道什么原因

另外,这句
holder.edit.setText(objects.get(position).toString());
最好要加上一个判断
if(position<objects.size())
{
holder.edit.setText(objects.get(position).toString());
}

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧