我目前遇到了一个非常奇怪的错误。我有一个gridview,其中充满了一些自定义视图。只要我不滚动,点击处理程序就可以正常工作。
但是当我向下滚动时,事件处理程序丢失了,不再做出反应了。我已经尝试添加一个onScrollEventHandler,但这似乎也迷失了。
代码非常标准:
grdVwUser = (GridView)findViewById(R.id.grdVwUser);
grdVwUser.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
long arg3) {
Log.e(TAG, "GOT CLICKED");
final Intent intent = getMyIntent(); // intent for another activity
startActivity(intent);
}
});
知道那可能是什么吗?
另外:我在logcat
中也收到此错误消息02-02 14:02:23.636: W/KeyCharacterMap(13871): Bad keycharmap - filesize=32
02-02 14:02:23.636: W/KeyCharacterMap(13871): Error loading keycharmap file '/system/usr/keychars/bravo-keypad.kcm.bin'. hw.keyboards.0.devname='bravo-keypad'
02-02 14:02:23.636: W/KeyCharacterMap(13871): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
但更进一步,GC似乎做了很多工作:
02-02 15:51:11.956: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 11572 objects / 678832 bytes in 62ms
02-02 15:51:12.096: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 1581 objects / 65072 bytes in 55ms
02-02 15:51:12.256: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 301 objects / 23248 bytes in 55ms
02-02 15:51:12.406: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 194 objects / 7816 bytes in 52ms
02-02 15:51:12.556: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 104 objects / 3920 bytes in 52ms
02-02 15:51:12.686: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 107 objects / 3968 bytes in 54ms
可能是因为GC会将处理程序链接到gridview的对象吗? (当我将Activity本身用作OnItemClickhandler时会产生相同的行为)
调试结果1: 我也尝试了它而没有开始另一个活动。我的网格单元显示一些从网络服务器延迟加载的图像。当我滚动它时丢失了事件处理程序但是当asynctask设置新图像时我将其取回并且能够再次单击。 滚动后我又丢了它。
调试结果2: 在玩完之后我添加了一个onscroll-handler,它将一个新的匿名类设置为事件处理程序,它调用活动的onItemClicked方法。只是为了看看这是否有用 - 它没有! 我还在匿名方法和滚动中添加了一个日志输出。 on scroll会被调用,但是onItemClicked事件处理程序却没有。 这意味着什么?
调试结果3: 即使onItemClicked没有,OnTouch也会被触发。
答案 0 :(得分:0)
我最终自己写了一个项目点击事件消防机制:
grdVwUser.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int newy = (int)(event.getY());
boolean val = false;
int traveled = 0;
if(event.getAction() == MotionEvent.ACTION_MOVE) {
traveled = Math.max(newy - lastTouchedY, lastTouchedY - newy);
}
// lastTouchedY is a member var
if(event.getAction() == MotionEvent.ACTION_DOWN) {
lastTouchedY = (int)event.getY();
} else if(event.getAction() == MotionEvent.ACTION_UP) {
if(traveled <= 40) {
int pos = grdVwUser.pointToPosition((int)event.getX(), (int)event.getY());
Main.this.onItemClick(null, grdVwUser, pos, -1);
val = true;
}
}
return val;
}
});