Reputation: 5764
I have a ListView
item layout that is using a HorizontalScrollView
in the center. I have used the android attribute "android:descendantFocusability="blocksDescendants"
" on my parent LinearLayout
so that the ListView
items are still selectable.
The problem I am having is that when clicking the part of the ListView
item which is the HorizontalScrollView
, the ListView
item click event is not called.
How can I get the click event of the HorizontalScrollView
to call the ListView
list item click event?
Upvotes: 6
Views: 3034
Reputation: 1719
Adding boolean variables touchDown and touchUp to the adapter class as follows seems to work fairly well:
private class MyListAdapter extends ArrayAdapter<MyObject>{
...
//touch down + touch up with no other motion events in between = click
boolean touchDown = false;
boolean touchUp = false;
private int iHostViewID;
...
public MyListAdapter(Context context,int viewResourceId, List<MyObject> objects) {
super(context, textViewResourceId, objects);
iHostViewID = viewResourceId;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent){
View itemView = convertView;
//iff we cannot re-use a view
if(itemView == null){
LayoutInflater inflater = (
(LayoutInflater)hContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(iHostViewID, null);
}
final View hItemView = itemView;
final int hPosition = pos;
...
final HorizontalScrollView textDataSV =
(HorizontalScrollView)itemView.findViewById(R.id.widget_hsv);
textDataSV.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
touchDown = true;
}
else if(event.getAction() == MotionEvent.ACTION_UP){
touchUp = true;
}
else{
touchDown = false;
touchUp = false;
}
if(touchDown && touchUp){
//click
//mMyListView is the reference to the list view
//instantiated in the view controller class responsible
//for setting this adapter class as the list view's adapter
mMyListView.performItemClick(hItemView, hPosition,
hItemView.getId());
}
return false;
}
});
}
}
It's far from perfect, but should work for most standard use-cases
Upvotes: 0
Reputation: 3370
HorizontalScrollView doesn't have "onClick()", see this http://developer.android.com/reference/android/widget/HorizontalScrollView.html
It support gestures and have "onTouchEvent(MotionEvent ev)"
So you can use it as click. See followin demo which I hav prepared.
// Followin code will not work for HorizontalScrollView
/*hsv1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(HorizontalListActivity.this, tvMiddle.getText().toString().trim(), Toast.LENGTH_SHORT).show();
}
});*/
hsv1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(YourActivity.this, "Your Msg", Toast.LENGTH_SHORT).show();
return false;
}
});
Upvotes: 1