Android findViewById() 与 ListView 中的 onFling 问题
我有一个扩展 ListActivity 的类。 此类显示 AbsListView,每行填充有总线 ID 和总线名称... 当我在...('onFling')上做出滑动手势时,我尝试处理一行的总线名称,但是当我这样做时,手势被正确处理,但我只能获取视图(使用 findViewByID())第一行....我需要获取 Flinged 行的视图!
谢谢你!
这是我的代码...:
public class dayBusList extends ListActivity{
AbsListView lv;
AABDatabaseManager db;
GestureDetector mGestureDetector = null;
View.OnTouchListener mGestureListener = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new AABDatabaseManager(dayBusList.this);
setListAdapter(new SpeechListAdapter(this));
lv = getListView();
lv.setTextFilterEnabled(true);
lv.setBackgroundColor(0xffffffff);
lv.setFastScrollEnabled(true);
lv.setSoundEffectsEnabled(true);
//Gesture detector for swipe...
mGestureDetector = new GestureDetector(new MyGestureDetector());
mGestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent aEvent) {
if (mGestureDetector.onTouchEvent(aEvent))
return true;
else
return false;
}
};
lv.setOnTouchListener(mGestureListener);
......>列表视图的适配器
private class SpeechListAdapter extends BaseAdapter {
private Context mContext;
private String[] busIDS = db.getDayBusIds();
private String[] busNAMES = db.getDayBusNames();
public SpeechListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return busNAMES.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
SpeechView sv;
if (convertView == null) {
sv = new SpeechView(mContext, busIDS[position],
busNAMES[position]);
} else {
sv = (SpeechView) convertView;
sv.setTitle(busIDS[position]);
sv.setDialogue(busNAMES[position]);
}
return sv;
}
}
private class SpeechView extends LinearLayout {
private TextView busID;
private TextView busNAME;
public SpeechView(Context context, String title, String words) {
super(context);
this.setOrientation(HORIZONTAL);
ImageView busIcon = new ImageView(context);
busIcon.setImageResource(R.drawable.stm);
busIcon.setPadding(2, 20, 5, 20);
addView(busIcon,new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
busID = new TextView(context);
busID.setId(1);
busID.setTextSize(30);
busID.setTextColor(Color.BLUE);
busID.setPadding(5, 15, 5, 20);
//busID.setPadding(0, 0,10, 0);
busID.setText(title);
addView(busID, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
busNAME = new TextView(context);
busNAME.setId(2);
busNAME.setGravity(Gravity.TOP);
busNAME.setTextSize(15);
busNAME.setPadding(0, 0, 0, 0);
busNAME.setText(words);
busNAME.setTextColor(Color.GREEN);
busNAME.setWidth(160);
addView(busNAME, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
public void setTitle(String id) {
busID.setText(id);
}
public void setDialogue(String name) {
busNAME.setText(name);
}
}
......>手势检测的类
class MyGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 200;
private static final int SWIPE_MAX_OFF_PATH = 100;
private static final int SWIPE_THRESHOLD_VELOCITY = 100;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float dX = e2.getX()-e1.getX();
float dY = e1.getY()-e2.getY();
if (Math.abs(dY)<SWIPE_MAX_OFF_PATH &&
Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY &&
Math.abs(dX)>=SWIPE_MIN_DISTANCE ) {
if (dX>0) {
Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Right Swipe", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Left Swipe", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
}
I have a class that extend ListActivity.
This class show a AbsListView filled with bus IDs and a bus Names on each row...
I try to handle the bus Name of a row when I make a swipe gesture on...('onFling') but when I do that, the gesture is handled correctly but I can just get the Views (with findViewByID()) of the first row ....I need to get the Views of the Flinged row!
Thank you!
This is my code...:
public class dayBusList extends ListActivity{
AbsListView lv;
AABDatabaseManager db;
GestureDetector mGestureDetector = null;
View.OnTouchListener mGestureListener = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new AABDatabaseManager(dayBusList.this);
setListAdapter(new SpeechListAdapter(this));
lv = getListView();
lv.setTextFilterEnabled(true);
lv.setBackgroundColor(0xffffffff);
lv.setFastScrollEnabled(true);
lv.setSoundEffectsEnabled(true);
//Gesture detector for swipe...
mGestureDetector = new GestureDetector(new MyGestureDetector());
mGestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent aEvent) {
if (mGestureDetector.onTouchEvent(aEvent))
return true;
else
return false;
}
};
lv.setOnTouchListener(mGestureListener);
.......>THE ADAPTER FOR THE LIST VIEW
private class SpeechListAdapter extends BaseAdapter {
private Context mContext;
private String[] busIDS = db.getDayBusIds();
private String[] busNAMES = db.getDayBusNames();
public SpeechListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return busNAMES.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
SpeechView sv;
if (convertView == null) {
sv = new SpeechView(mContext, busIDS[position],
busNAMES[position]);
} else {
sv = (SpeechView) convertView;
sv.setTitle(busIDS[position]);
sv.setDialogue(busNAMES[position]);
}
return sv;
}
}
private class SpeechView extends LinearLayout {
private TextView busID;
private TextView busNAME;
public SpeechView(Context context, String title, String words) {
super(context);
this.setOrientation(HORIZONTAL);
ImageView busIcon = new ImageView(context);
busIcon.setImageResource(R.drawable.stm);
busIcon.setPadding(2, 20, 5, 20);
addView(busIcon,new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
busID = new TextView(context);
busID.setId(1);
busID.setTextSize(30);
busID.setTextColor(Color.BLUE);
busID.setPadding(5, 15, 5, 20);
//busID.setPadding(0, 0,10, 0);
busID.setText(title);
addView(busID, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
busNAME = new TextView(context);
busNAME.setId(2);
busNAME.setGravity(Gravity.TOP);
busNAME.setTextSize(15);
busNAME.setPadding(0, 0, 0, 0);
busNAME.setText(words);
busNAME.setTextColor(Color.GREEN);
busNAME.setWidth(160);
addView(busNAME, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
public void setTitle(String id) {
busID.setText(id);
}
public void setDialogue(String name) {
busNAME.setText(name);
}
}
.......>THE class for the gesture detection
class MyGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 200;
private static final int SWIPE_MAX_OFF_PATH = 100;
private static final int SWIPE_THRESHOLD_VELOCITY = 100;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float dX = e2.getX()-e1.getX();
float dY = e1.getY()-e2.getY();
if (Math.abs(dY)<SWIPE_MAX_OFF_PATH &&
Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY &&
Math.abs(dX)>=SWIPE_MIN_DISTANCE ) {
if (dX>0) {
Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Right Swipe", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Left Swipe", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一种选择是重写/实现 SpeechView 类的 onTouchEvent() 并处理 SpeechView 实例本身内的滑动。然后,您可以检查 SpeechView 实例的属性以了解刷了哪一行。
此外,您可以将 GestureDetector 传递到 SpeechListAdapter 中,并在最初创建 SpeechView 类时将其提供给该类。然后你可以将 MotionEvents 传递给它。
无论哪种情况,请务必通过返回 true 来拦截触摸事件。
One option is to override/implement the onTouchEvent() of your SpeechView class and handle the swipe within the SpeechView instance itself. You can then examine the properties of the SpeechView instance to know which row was swiped.
Additionally, you can pass a GestureDetector into your SpeechListAdapter and feed the to the SpeechView class when it is originally created. Then you can pass the MotionEvents into it.
In either case, be sure to intercept the touch event by returning true.
您只是很幸运,实际上已经定义了
findViewById(1))
。您不应在手势检测器中调用 findViweById。我很惊讶它没有崩溃。相反,您可以在 onGestureListener 中取回视图。在那里使用它。
You just happen to be lucky that
findViewById(1))
is actually defined. You shouldn't call findViweById in your gesture detector. I'm surprised that doesn't crash.Instead, you get the view back in your onGestureListener. Use it there.