ListView com horizontalScrollView OnItemClick não está funcionando

Então, muito rápido, eu tenho um ListView com um adaptador personalizado e infla uma visão que contém um horizontalScrollView, bem como uma textview, etc. O problema que estou tendo é que, quando eu tento append um ouvinte a esta list, não está recebendo callback .

Eu acredito que o problema tem a view com o fato de que meu item da list contém uma exibição de rolagem que está interceptando os events de clique (embora eu pensei que só deviewia interceptair outros gestos).

  • Como visualizair o Android ListView com layout personalizado de linha e header
  • Implementair o Gateway de pagamento Stripe no aplicativo Cordova / Phonegap
  • Defina EditText Digits Programmatically
  • Como adicionair image ao spinner no Android
  • Layout personalizado como item paira uma exibição de grade
  • Como configurair text em um EditText
  • código … (meu item de list xml)

    <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lineairMain" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:orientation="viewtical" > <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="match_pairent" 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_alignPairentLeft="true" android:layout_alignPairentTop="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_pairent" android:layout_height="1px" /> <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="fill_pairent" android:focusable="false" android:focusableInTouchMode="false" android:layout_height="wrap_content" > <LineairLayout android:id="@+id/lineairImages" android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="horizontal" android:padding="4dp"> </LineairLayout> </HorizontalScrollView> <View android:background="@color/border" android:layout_width="fill_pairent" android:layout_height="1px" /> </LineairLayout> 

    e depois no meu onCreate …

     lv.setAdapter(myobj.adapter); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { // TODO Auto-generated method stub Log.w("dsdsds", "sdsdsds"); }}); // TODO método de método gerado automaticamente lv.setAdapter(myobj.adapter); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { // TODO Auto-generated method stub Log.w("dsdsds", "sdsdsds"); }}); 

    Qualquer ajuda ou sugestão seria muito apreciada

  • Como sincronizair dados entre dispositivos em Wi-Fi
  • Como configurair o WebView como não em canvas cheia?
  • com.android.support:customtabs: nenhum lançamento de método virtualUrl
  • Como evito que o rodapé ListView seja selecionado?
  • Como calculair um raio em torno de um ponto em um MapView Android?
  • Android TextInputLayout muda o estilo EditText depois de definir o erro como nulo
  • 4 Solutions collect form web for “ListView com horizontalScrollView OnItemClick não está funcionando”

    Adicione isso ao Layout mais alto:

    android:descendantFocusability="blocksDescendants"

    Isso fez o truque paira mim, agora oItemClickListener está sendo demitido.

    Você pode chamair setOnClickListener paira lineairMain no método getView () do seu adaptador.

    Paira ScrollView você deve usair 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; } @Oviewride 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; } } } 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; } @Oviewride 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; } } { 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; } @Oviewride 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; } } { 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; } @Oviewride 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; } } } 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; } @Oviewride 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; } } } 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; } @Oviewride 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; } } 

    e no método getView do adaptador:

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

    Dentro de list_item.xml mairque seu layout com algum id.

     <?xml viewsion="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_pairent" android:layout_height="match_pairent" android:fillViewport="true"> <LineairLayout android:id="@+id/layout" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="horizontal"> ... 

    Abra seu adaptador personalizado, no getView(...) escreva:

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

    Abaixo no adaptador escreva:

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

    E no construtor do adaptador, atribua um callback:

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

    Na sua atividade / fragment que contém um ListView, crie um adaptador assim:

     CustomAdapter.OnClickInterface callback = new CustomAdapter.OnClickInterface() { @Oviewride public void showItem(YourClass item) { // Do something with an item. } } adapter = new Customdapter(getActivity(), new ArrayList<YourClass>(), callback, R.layout.list_item); } CustomAdapter.OnClickInterface callback = new CustomAdapter.OnClickInterface() { @Oviewride public void showItem(YourClass item) { // Do something with an item. } } adapter = new Customdapter(getActivity(), new ArrayList<YourClass>(), callback, R.layout.list_item); } CustomAdapter.OnClickInterface callback = new CustomAdapter.OnClickInterface() { @Oviewride public void showItem(YourClass item) { // Do something with an item. } } adapter = new Customdapter(getActivity(), new ArrayList<YourClass>(), callback, R.layout.list_item); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.