写了一个用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上,求高手帮忙解决一下,谢谢!
继承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上,求高手帮忙解决一下,谢谢!
holder.edit.setText(objects.get(position).toString());
最好要加上一个判断
if(position<objects.size())
{
holder.edit.setText(objects.get(position).toString());
}
为此处:int pos = (Integer)mHolder.edit.getTag();但此处并无问题啊。
可能我没说清楚,我遇到的情况是:
单独的holder.edit.addTextChangedListener(new MyEditWatcher(holder));
或者convertView.setTag(holder);
都没有问题,但是两个同时存在就会出错。
我觉得是tag里的holder里的edit中得textchangedlistener问题,settext会触发这个监听器。
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)
07-13 13:52:53.065: E/AndroidRuntime(936): at hill.Gridtest.EditTextAdapter$1MyEditWatcher.afterTextChanged(EditTextAdapter.java:59)很明显,你在不同的地方,给 mHolder.edit 分别set了 ViewHolder和Integer类型 的tag
int pos = (Integer)mHolder.edit.getTag();
前面加一行
Log.i("调试", "Tag=" + mHolder.edit.getTag() + "。");然后将输出结果发上来看一下。