2012-01-28 24 views
6

Así que realmente rápido tengo un listView con un adaptador personalizado y se infla una vista que contiene un horizontalScrollView, así como una vista de texto, etc. El problema que tengo es que cuando trato de conectar un oyente a esta listaVer que no está recibiendo ninguna devolución de llamada.ListView con horizontalScrollView OnItemClick no funciona

Creo que el problema tiene que ver con el hecho de que mi elemento de lista contiene una vista de desplazamiento que está interceptando los eventos de clic (aunque pensé que solo debería interceptar otros gestos). código

... (mi lista de elementos XML)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearMain" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/grey" > 

     <TextView 
      android:id="@+id/headerName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:padding="4dp" 
      android:textColor="@color/text_header" 
      android:textStyle="bold" 
      android:text="TextView" /> 

    </RelativeLayout> 
    <View 
     android:background="@color/border" 
     android:layout_width="fill_parent" 
     android:layout_height="1px" /> 
    <HorizontalScrollView 
     android:id="@+id/horizontalScrollView1" 
     android:layout_width="fill_parent" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:id="@+id/linearImages" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="horizontal" 
      android:padding="4dp"> 
     </LinearLayout> 
    </HorizontalScrollView> 
    <View 
     android:background="@color/border" 
     android:layout_width="fill_parent" 
     android:layout_height="1px" /> 
</LinearLayout> 

y luego en mi onCreate ...

lv.setAdapter(myobj.adapter); 
    lv.setTextFilterEnabled(true); 
    lv.setOnItemClickListener(new OnItemClickListener(){ 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      // TODO Auto-generated method stub 
      Log.w("dsdsds", "sdsdsds"); 
     }}); 

Cualquier ayuda o sugerencia sería muy apreciada

+0

cualquier consejo sería grande – Maurycy

+0

Así que ninguna de las respuestas realmente solucionar este problema y no tengo acceso al código base más. Si alguien se encuentra con este problema y tiene una solución conocida, aceptaré – Maurycy

Respuesta

1

Puede llama a setOnClickListener para linearMain en el método getView() de tu adaptador.

1

para ScrollView se debe utilizar OnTouchListener, como:

private class ScrollViewOnTouchListener implements OnTouchListener{ 
     HorizontalScrollView view; 
     float historicX = Float.NaN; 
     static final int DELTA_ON_CLICK = 20; 
     long historicTime; 
     int position; 
     public ScrollViewOnTouchListener(HorizontalScrollView view, int position){ 
      this.view = view; 
      this.position = position; 
     } 

     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      switch (event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
       historicX = event.getX(); 
       historicTime = System.currentTimeMillis(); 
       break; 

       case MotionEvent.ACTION_UP: 

       if (Math.abs(event.getX() - historicX) < DELTA_ON_CLICK) 
        // seems like onclick 
        // do what you want for onClick 

       break; 
       default: return false; 
      } 
      return true; 
     } 


    } 

y en el método getView del adaptador:

public View getView(int position, View convertView, ViewGroup parent) { 
    ... 
    HorizontalScrollView scrollItem; 
    scrollItem =( HorizontalScrollView)itemView.findViewById(R.id.item_scroll_view); 
    scrollItem .setOnTouchListener(new ScrollViewOnTouchListener(scrollItem , position));  
} 
2

Esto, unido al diseño superior:

android:descendantFocusability="blocksDescendants"

Me funcionó, ahora onItemClickListener está siendo despedido.

+0

gracias, es útil para mí ... –

+0

¿dónde poner esto - en el diseño raíz del elemento de la lista? – NarendraJi

+0

@DroidWormNarendra sí en el diseño del artículo –

0

Dentro list_item.xml marcar su diseño con un poco de Identificación:

<?xml version="1.0" encoding="utf-8"?> 
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
         xmlns:tools="http://schemas.android.com/tools" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:fillViewport="true"> 

    <LinearLayout 
     android:id="@+id/layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

... 

Abra el adaptador personalizado, en getView(...) escritura:

layout = view.findViewById(R.id.layout); 
layout.setTag(position); 
layout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (callback != null) { 
       callback.showItem(getItem((int) v.getTag())); 
      } 
     } 
    }); 

continuación en el adaptador de escritura:

public interface OnClickInterface { 
    void showItem(YourClass item); 
} 

Y en el constructor del adaptador asignar una devolución de llamada:

public CustomAdapter(Context context, List<YourClass> list, OnClickInterface callback, int resId) { 
    this.callback = callback; 
    ... 

En su actividad/fragmento que contiene un ListView crear un adaptador de este modo:

CustomAdapter.OnClickInterface callback = new CustomAdapter.OnClickInterface() { 
     @Override 
     public void showItem(YourClass item) { 
      // Do something with an item. 
     } 
} 
adapter = new Customdapter(getActivity(), new ArrayList<YourClass>(), callback, R.layout.list_item); 
Cuestiones relacionadas